精华内容
下载资源
问答
  • 由于大创的分工,简单熟悉了一下爬虫便开始爬取数据 本篇博客爬取的数据网址为天气后报...根据对应的城市所显示的页面获取2020年1至2020年12月的数据url地址 根据每城市各个月份的url地址获取其中的表格数据 将数据

    由于大创的分工,简单熟悉了一下爬虫便开始爬取数据

    本篇博客爬取的数据网址为天气后报

    一、思路介绍

    首先说一下爬虫的思路

    1. 获取网页的url
    2. 获取网页的html
    3. 对其进行数据解析,由于博主对xpath的理解能力所限,此处既使用了靓汤又使用了xpath
    4. 将数据持久化存储,即存进csv文件中

    再来说说本次项目的思路:

    1. 获取所有的城市名称与url地址并存放进一个字典类型中
    2. 根据对应的城市所显示的页面获取2020年1月至2020年12月的数据url地址
    3. 根据每个城市各个月份的url地址获取其中的表格数据
    4. 将数据写入csv文件中持久化存储

    二、准备工作

    import requests
    from lxml import etree
    from bs4 import BeautifulSoup
    import csv
    import os
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
    }
    
    

    使用requests访问网页并获取网页源码
    使用etree的xpath以及BeautifulSoup对数据解析,获取想要的数据
    使用csv库调用相关函数存储数据进csv文件
    使用os库创建文件夹
    headers为访问网页时所用的User-Agent,进行UA伪装

    三、获取城市名称及url

    注意点1:如下图所示,在一开始使用xpath爬取的时候爬取到如内蒙古省的时候只能爬取到第一行的城市,后来细看发现城市排布超过一行的省都会包含一个<wbr>标签,阻碍了后面数据的获取,由于没想到好的办法直接使用了BeautifulSoup的find_all和select来获取所有的<a>标签中的href和文本
    在这里插入图片描述
    注意点2:如下图,百色市的连接出现了断裂,在获取后的文本为http://www.tianqihoubao.com/aqi/baise\r\n.html,多了\r\n,因此无法正确访问该城市的网页,因此可以直接在代码中加个特殊判断
    在这里插入图片描述
    注意点3:<a>标签中每个城市的文本之后都有一个空格,如上如百色市<a>中文本为
    “百色 ”,此处有一个空格,若不想要该空格可以在获取文本时使用strip函数除去

    代码展示如下

    ############################################################
    # 函数功能:获取各个城市的名字及对应的url
    # 传入参数:无
    # 输出参数:citys_name,字典类型,城市名称为键,对应的url为值
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_city():
        url = r'http://www.tianqihoubao.com/aqi/'
    
        response = requests.get(url=url, headers=headers).text
        soup = BeautifulSoup(response, 'lxml')                           # 用靓汤解析网页源码获取class为citychk的标签
        tables = soup.find_all(class_="citychk")
    
        citys_name = dict()
        for table in tables:
            citys_url = table.select("a")                                 # 挑选出其中的a标签并抽取其中的文本以及href
            for city in citys_url:
                city_name = city.text.strip()                             # 城市名称,使用strip去除尾部的空格
                city_name = city_name.encode('iso-8859-1').decode('gbk')  # 对中文乱码重新编码
                city_urls = city.attrs.get("href").strip()                # 城市的url
    
                if city_name == "全国空气质量排名":                         # 忽略网页中禹城市无关的文本
                    continue
                # 百色需要特殊处理——html源码中的地址爬取后为http://www.tianqihoubao.com/aqi/baise\r\n.html
                # 由于噪声字符不是位于字符串的头和尾,因此需要额外加个特判
                if city_name == "百色":
                    citys_name[city_name] = "http://www.tianqihoubao.com/aqi/baise.html"
                    continue
    
                citys_name[city_name] = "http://www.tianqihoubao.com" + city_urls   # 添加字典,格式为:城市名称——对应url
    
        return citys_name
    

    四、获取各月份的url

    此处使用的xpath解析数据,xpath的编写使用了逻辑或串起来,需要修改直接修改 li 的下标值即可,添加也是直接或上新的xpath值,返回的months中是各个月的url地址

    代码展示如下

    ############################################################
    # 函数功能:根据城市的url获取历史大气数据页面的url
    # 传入参数:city_url,字符串类型,表示城市的url地址
    # 输出参数:months,列表类型,表示该城市一年各月份数据的url
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_month(city_url):
        months = list()
    
        response = requests.get(url=city_url, headers=headers).text
        tree = etree.HTML(response)                     # 使用etree解析网页源码,下面为xpath
        month_list = tree.xpath('//div[@class="box p"]//li[2]/a/@href | //div[@class="box p"]//li[3]/a/@href'
                                '| //div[@class="box p"]//li[4]/a/@href | //div[@class="box p"]//li[5]/a/@href'
                                '| //div[@class="box p"]//li[6]/a/@href | //div[@class="box p"]//li[7]/a/@href'
                                '| //div[@class="box p"]//li[8]/a/@href | //div[@class="box p"]//li[9]/a/@href'
                                '| //div[@class="box p"]//li[10]/a/@href | //div[@class="box p"]//li[11]/a/@href'
                                '| //div[@class="box p"]//li[12]/a/@href | //div[@class="box p"]//li[13]/a/@href')
    
        for month in month_list:
            month = r'http://www.tianqihoubao.com' + month          # 某城市每个月的url
            months.append(month)
    
        return months
    

    五、获取各项数值

    存储数据的为表格,因此直接两层循环解析即可,外层循环解析行(<tr>),内层循环解析列(<td>),将每一天的保存为列表,再将该列表保存进一个大列表用于存放一个月中每一天的数据
    注意点:爬取的数据中可能会在头尾含有空格或\r\n之类的,因此直接用strip()函数去掉,保留下有效数据

    代码展示如下

    ############################################################
    # 获取历史数据
    # 输入参数:month_url, 字符串类型,对应月份的url地址
    # 输出参数:data_list, 列表,元素也为列表,12个月份的数据
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_record(month_url):
        response = requests.get(url=month_url, headers=headers).text
        tree = etree.HTML(response)
        tr_list = tree.xpath('//div[@class="api_month_list"]/table//tr')
    
        data_list = list()
        for tr in tr_list[1:]:                          # 定位到行,除去表头
            td_list = tr.xpath('./td/text()')
            data = list()
            for td in td_list:                          # 定位到具体列
                data.append(td.strip())                 # 使用strip函数出去原来数据头和尾的\r\n以及空格
            data_list.append(data)
    
        return data_list
    

    六、main函数编写

    获取个城市的名称以及url,再获取每个月的url,之后获取数据并保存进指定路径

    代码展示如下

    def main():
        if not os.path.exists(r"./AQIoneMonth"):            # 创建文件夹
            os.mkdir(r"./AQIoneMonth")
    
        citys_name = get_city()                     # 获取城市名称及url
        for city in citys_name:                     # city为字符串,表示城市名称
            print("开始爬取%s的历史大气数据" % city)
            city_url = citys_name[city]
            months = get_month(city_url)            # 该城市对应的12个月的连接
            index = 0
            for month_url in months:
                index = index + 1
                data_list = get_record(month_url)   # 获取每个月的数据
                with open('./AQIoneMonth/' + city + '.csv', 'a', newline="", encoding="utf-8") as f:
                    writer = csv.writer(f)
                    if index == 1:                  # 写入表头,只写入一次
                        writer.writerow(
                            ["日期", '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'SO2', 'NO2', 'CO', 'O3'])
                    writer.writerows(data_list)     # 写入数据
                print("第%d个月已经爬取完成" % index)
            print()
    

    注意:爬取时间比较长,在爬取较长时间后会出现卡死,此时可以终止程序的运行,在最外层循环设置i变量,控制第二次开始时开始的城市的位置,至于i的值可以看已经爬取的文件夹中已经包含文件的个数,据此来改变i的值重新运行继续捕获,示例代码如下:

    def main():
        if not os.path.exists(r"./AQI"):            # 创建文件夹
            os.mkdir(r"./AQI")
    
        citys_name = get_city()                     # 获取城市名称及url
        print(citys_name)
        i = 0
        for city in citys_name:                     # city为字符串,表示城市名称
            i = i + 1
            if i > 168:
                print("开始爬取%s的历史大气数据" % city)
                city_url = citys_name[city]             # 获取每个城市的url
                months = get_month(city_url)            # 获取该城市对应的12个月的url
    
                index = 0
                for month_url in months:
                    index = index + 1
                    data_list = get_record(month_url)   # 获取每个月的数据
    
                    with open('./AQI/' + city + '.csv', 'a', newline="", encoding="utf-8") as f:
                        writer = csv.writer(f)
                        if index == 1:                  # 写入表头,只写入一次
                            writer.writerow(
                                ["日期", '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'SO2', 'NO2', 'CO', 'O3'])
                        writer.writerows(data_list)     # 写入数据
    
                    print("第%d个月已经爬取完成" % index)
                print()
    

    还有一个注意点是:思茅市、巢湖市、二连浩特市、莱芜市、伊犁哈萨克州没有数据,因此该网站爬取不到以上城市的数据,此外那曲市只有2020年5月以及之前的数据,之后的数据也没有,无法爬取。

    七、完整代码

    # -*- coding = utf-8 -*-
    
    import requests
    from lxml import etree
    from bs4 import BeautifulSoup
    import csv
    import os
    
    # UA伪装所使用的User-Agent
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
    }
    
    
    ############################################################
    # 函数功能:获取各个城市的名字及对应的url
    # 传入参数:无
    # 输出参数:citys_name,字典类型,城市名称为键,对应的url为值
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_city():
        url = r'http://www.tianqihoubao.com/aqi/'
    
        response = requests.get(url=url, headers=headers).text
        soup = BeautifulSoup(response, 'lxml')                           # 用靓汤解析网页源码获取class为citychk的标签
        tables = soup.find_all(class_="citychk")
    
        citys_name = dict()
        for table in tables:
            citys_url = table.select("a")                                 # 挑选出其中的a标签并抽取其中的文本以及href
            for city in citys_url:
                city_name = city.text.strip()                             # 城市名称,使用strip去除尾部的空格
                city_name = city_name.encode('iso-8859-1').decode('gbk')  # 对中文乱码重新编码
                city_urls = city.attrs.get("href").strip()                # 城市的url
    
                if city_name == "全国空气质量排名":                         # 忽略网页中禹城市无关的文本
                    continue
                # 百色需要特殊处理——html源码中的地址爬取后为http://www.tianqihoubao.com/aqi/baise\r\n.html
                # 由于噪声字符不是位于字符串的头和尾,因此需要额外加个特判
                if city_name == "百色":
                    citys_name[city_name] = "http://www.tianqihoubao.com/aqi/baise.html"
                    continue
    
                citys_name[city_name] = "http://www.tianqihoubao.com" + city_urls   # 添加字典,格式为:城市名称——对应url
    
        return citys_name
    
    
    ############################################################
    # 函数功能:根据城市的url获取历史大气数据页面的url
    # 传入参数:city_url,字符串类型,表示城市的url地址
    # 输出参数:months,列表类型,表示该城市一年各月份数据的url
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_month(city_url):
        months = list()
    
        response = requests.get(url=city_url, headers=headers).text
        tree = etree.HTML(response)                     # 使用etree解析网页源码,下面为xpath
        month_list = tree.xpath('//div[@class="box p"]//li[2]/a/@href | //div[@class="box p"]//li[3]/a/@href'
                                '| //div[@class="box p"]//li[4]/a/@href | //div[@class="box p"]//li[5]/a/@href'
                                '| //div[@class="box p"]//li[6]/a/@href | //div[@class="box p"]//li[7]/a/@href'
                                '| //div[@class="box p"]//li[8]/a/@href | //div[@class="box p"]//li[9]/a/@href'
                                '| //div[@class="box p"]//li[10]/a/@href | //div[@class="box p"]//li[11]/a/@href'
                                '| //div[@class="box p"]//li[12]/a/@href | //div[@class="box p"]//li[13]/a/@href')
    
        for month in month_list:
            month = r'http://www.tianqihoubao.com' + month          # 某城市每个月的url
            months.append(month)
    
        return months
    
    
    ############################################################
    # 获取历史数据
    # 输入参数:month_url, 字符串类型,对应月份的url地址
    # 输出参数:data_list, 列表,元素也为列表,12个月份的数据
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def get_record(month_url):
        response = requests.get(url=month_url, headers=headers).text
        tree = etree.HTML(response)
        tr_list = tree.xpath('//div[@class="api_month_list"]/table//tr')
    
        data_list = list()
        for tr in tr_list[1:]:                          # 定位到行,除去表头
            td_list = tr.xpath('./td/text()')
            data = list()
            for td in td_list:                          # 定位到具体列
                data.append(td.strip())                 # 使用strip函数出去原来数据头和尾的\r\n以及空格
            data_list.append(data)
    
        return data_list
    
    
    ############################################################
    # main函数
    # 修改时间:2020/1/23
    # 修改理由:暂无
    ############################################################
    def main():
        if not os.path.exists(r"./AQI"):            # 创建文件夹
            os.mkdir(r"./AQI")
    
        citys_name = get_city()                     # 获取城市名称及url
        for city in citys_name:                     # city为字符串,表示城市名称
            print("开始爬取%s的历史大气数据" % city)
            city_url = citys_name[city]             # 获取每个城市的url
            months = get_month(city_url)            # 获取该城市对应的12个月的url
    
            index = 0
            for month_url in months:
                index = index + 1
                data_list = get_record(month_url)   # 获取每个月的数据
    
                with open('./AQI/' + city + '.csv', 'a', newline="", encoding="utf-8") as f:
                    writer = csv.writer(f)
                    if index == 1:                  # 写入表头,只写入一次
                        writer.writerow(
                                ["日期", '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'SO2', 'NO2', 'CO', 'O3'])
                    writer.writerows(data_list)     # 写入数据
    
                print("第%d个月已经爬取完成" % index)
            print()
    
    
    if __name__ == '__main__':
        main()
    
    展开全文
  • //取下一个月的第一天,方便计算(最后一天不固定) if (month > 12) //如果当前大于12月,则年份转到下一年 { new_month -= 12; //月份减 new_year++; //年份增 } var new_date = new ...
  • 场景设定:处理一批气象数据,一年12月12个xls文件,每个文件含当月天数*2个sheets,每个sheet包含前几行的固定说明以及从第6行开始的逐时气象数据,两批sheet各有相同的格式但数据指标不同,现解决如下问题:将...

    场景设定:处理一批气象数据,一年12月共12个xls文件,每个文件含当月天数*2个sheets,每个sheet包含前几行的固定说明以及从第6行开始的逐时气象数据,两批sheet各有相同的格式但数据指标不同,现解决如下问题:将其中的某些指标提取出来并按照时间顺序组成一年时间序列的数据,解决手段R,辅助包rJava,xlsxjars,xlsx。

    代码如下:

    #This R scripts are used to handle meteorological data
    library(rJava)
    library(xlsxjars)
    library(xlsx)
    #file1<-".../气象数据/"                          #Obtain root dir
    #allfiles<-list.files(file1)                     #obtain all file names
    THRAD<-c(1,1:2)
    names(THRAD)<-c("Eg","PAR")
    THLOG<-c(1,1:13)
    names(THLOG)< c("T","Ee","P","Winds","Windd","D0","D5","D10","D15","D20","D40","D60","D100")
    #January
    JRfnames<-paste("Rad01",1:31,sep="")
    JLfnames<-paste("Log01",1:31,sep="")
    for(i in 1:31)
    {
      tfile<-JRfnames[i]
      tfile1<-JRfnames[i]
      tfile<-read.xlsx(".../气象数据/01.xls",i,encoding="UTF-8",stringsAsFactors=FALSE)
      tfile1<-read.xlsx(".../气象数据/01.xls",i+31,encoding="UTF-8",stringsAsFactors=FALSE)
      Ntfile<-tfile[6:29,c(4,8)]
      names(Ntfile)<-c("Eg","PAR")                        #rename coloum names
      Ntfile1<-tfile1[6:29,c(3,12:13,24:25,36:43)]
      names(Ntfile1)<-c("T","Ee","P","Winds","Windd","D0","D5","D10","D15","D20","D40","D60","D100")
      THRAD<-rbind(THRAD,Ntfile,stringsAsFactors=FALSE)
      THLOG<-rbind(THLOG,Ntfile1,stringsAsFactors=FALSE)
    }
    ...
    write.csv(THRAD,".../Rad.csv")
    write.csv(THLOG,".../Log.csv")

    此次探索过程中主要解决了两个问题:(1)rbind()在使用的过程中一定要保证列名一致,否则会出现错误,可以采用names()重命名列名后再进行纵向合并;(2)rbind()在拼接的过程中可能出现因子问题,此处使用stringsAsFaxctors=FALSE规避这个问题。

    展开全文
  • 为自己代言:《零基础学Python数据分析与挖掘》视频教程上线啦01 这真有必要做那么多工作表吗?太多的人觉得每个月一个表格存放数据,一年12个月,一个工作薄文件里放12个工作表,然后还...

    为自己代言:《零基础学Python数据分析与挖掘》视频教程上线啦

    01 这真有必要做那么多工作表吗?

    太多的人觉得每个月一个表格存放数据,一年12个月,一个工作薄文件里放12个工作表,然后还有大量的插件批量生成工作表,批量重命名工作表、工作表排序等一系列的功能来辅助完成这些提速性工作。

    这样的做法却从来没有人去思考它的合理性所在,一路下来,前辈带后辈,模板都这样通用下来了,美其名说不用想太多,照着模板填下数就OK,不知道这些的思维方式害死多少人在没日没夜地在做表格。

    正确的做表方式为:同一主题的数据,尽可能地在一个工作表里完成,多个月的数据,要做区分,不过是多加一列月份,标记下这些数据的附加特征、属性就可以。后期数据分析时,数据源是连贯的,用数据透视表一引用,想看哪月数据就看哪月,想看整年数据也直接汇总下就有。

    数据量太大,一个表存不下怎样办?


    既然数据量这么大,就寻求下IT人员的辅助,或者自己再加一点点的学习,接触下数据库这东西,最终也不是个问题。

    02 合并、拆分工作表,真的必要吗?

    如果第一点里能够做好,这个第二点也是个伪需求,就算有需求,Excel的自助式BI组件,对处理这些需求也是分分钟的事情,学习难度也不过是日常表格基本操作的水平,小白级的用户都能轻松掌握。

    笔者一直坚持小即是多,不增加用户的学习负担,只推荐最好的解决方案,除非是万不得已的因为权限问题需要拆分工作表。

    03 各种合并单元的各类技巧真的必要吗?

    合并单元格不得不说,是数据处理过程中的一大雷区,许多的用户,为了所谓的审美美观,同一个数据内容,多行展示不好看,来个合并居中,好看多了。

    殊不知这样一搞,整份数据源就面临灭顶之灾:排序、筛选不能用了,数据透视表也报错了等等。

    更糟糕的是,各大插件还赶来帮倒忙,合并了数据不丢失,合并了可以还原数据等等。

    正确的使用方式为:最大可能性地不在数据源里使用合并单元格功能,可以随意在报表层面使用合并单元格进行最后的美观处理。报表层即是数据结果层,无需对数据进行其他的函数公式引用,数据透视表引用等。

    一般来说,报表层操作步骤都很有限,想想一份打印的报表数据,才几十行数据就已经阅读够类的,几十行数据,合并个10多次的操作,用F4重复操作也没多难的事情。用不着天天去寻觅各大插件的高级批量处理功能。

    04 批注功能衍生的各类需求

    纵观各大插件的功能,发现还是许多功能围绕着批注来进行加强,如批量图片到批注,批量修改批注内容等。

    我理解的批注:批注是个临时性的标记,用于查看过程中手工发现问题记录一下。


    正确的做法是把批注过的内容,需要重新以数据源的方式追加到数据源内,通常新建一列,填写相应的内容。

    此时的好处是新建的列数据,可以进行查找替换、排序、筛选等正常的操作。无需很别扭地因为数据在批注里无法进行这一系列操作的尴尬。

    同样的问题也出现在单元格的颜色标注上,这些的标注,可以美观加分一点,但如果是为了区分数据,有更进一步的数据分析意义,请加上一列,把不同行的信息区分用文字来落实表达出来。

    至于批注放个图片,需要查看时鼠标放至单元格上即可显示,好便利,这个也是个伪需求,图片插入到单元格里,或者利用自由报表的形式,重新对数据+图片的排版。无论是打印还是电脑阅读都比用批注存放图片来得更好。

    05 动不动就选一列或一行进行操作

    在Excel2007及之后,无论是行数还是列数,都有很大的扩展,若不小心在一行或一列里进行了数据引用、字体、颜色、背景、边框等设置,这些将会大大地增大了其作用范围。本来是设置几十个单元格,变成了设置几百万个单元格。

    因为这些的不合规的操作,致使出现了工作薄文件突然增大,明明几百行的数据,文件却几十M的大小,明明简单的一个函数,运行起来却巨慢无比。然后也出现也插件界量身定制的工作薄、工作表瘦身功能。

    正确的使用方式:

    • 要用多少,引用多少的单元格,不要动不动就整列、整行的选择。一般整列、整行只是删除、调整行列高之类的整体性的操作才有需求。

    • 使用Excel智能表功能,智能表功能不仅有间隔行颜色填充这样的表面性表现,同时它是结构化的数据,可以轻松地选择数据区域内的一行或一列或全表等操作。在做数据引用时非常轻松。

    06 有那么多的删除、插入空行的操作吗?

    对这些需求的人,也是没有分清数据源和报表的区别,数据源是基础,报表是引用数据源生成的结果数据。

    一般的数据处理、分析的时间分配是80%的时间在做数据源的清洗、整顿。通常这些插入空行的操作,极大的破坏了数据源的数据结构,给数据源的清洗带来灾难性的问题。

    在报表层的插入空行的操作,回到上面所说的,报表层,需调整的余地和动作很少,一般人工操作的步骤范围也是可接受的范围内,最多是数据透视表+自由报表功能,可满足绝大多数的报表排版需求。

    至于这些插入、删除空行的操作,反正我是几乎没有用到过,是因为我做表太少还是我在思考和实践正确的做表习惯和思维,这个留给大家思考。

    07 数据聚光灯功能的使用真的刚需吗?

    学习VBA的人,或多或少都会接触到这个数据聚光灯的功能,点击某个单元格,然后可以高亮其对应的行和列,防止数据看错行或看错列。

    这个功能的开发,还分出了不少层级水平。

    • 初级水平:功能实现了,却破坏了原来的颜色标注,使原有的颜色标注被清除了。

    • 高级水平:无论是颜色标注还是条件格式的颜色,都可以保留,完美实现功能所需。

    这个功能在插件界也是呼声很大,很多用户很想拥有,开发者也多数以能够成功开发完美的聚光灯功能来展示实力水平。

    但问题是,对于数据源的查看,数据量是很大,但有了智能表的间隔行颜色区分,加上排序、筛选等操作,出现看错行列的机率几乎很少。报表层面数据量本来就少,数据透视表也可以套用间隔行的颜色填充,看错的机率就更少。

    说实话,真不知道这个需求的群体是哪些,如果真有,欢迎在下方评论区讨论一下。

    08  从一个单元格提取出想要的信息

    这个想必最多人吐槽的不合规的做表方式,一个单元格存储内容:猪肉,3斤,油8两,青菜800克。

    就算各家插件有几种能耐帮你重新从一堆文本里把需要的信息提取出来,但这个意义何在,这就是加班做的事么?

    犹如一栋高楼需要坚实的地基,一份有价值的数据,也需要合理的前期数据规划不是什么都临时性地做一下,把Excel当作一个草稿纸,反正信息记录下来了,日后要用到时,也可以从中取出来用。

    但这个取的动作,代价之高,没几条生命可以折腾得住,更可气的是,这个烂摊子还要留给不少后来者一同来打扫,难受得很!

    这些烂摊子的需求,也扭曲性地催生了一系列的插件功能,笔者不得不向其低头,同样提供了这类的文本处理功能,烂摊子多了去,何年可休也?

    09 修改原有数据,最后无法还原

    某些时候,因数据分析的上层需求,需要在数据源中提取相关信息作分析,如果数据源不规范,在数据处理过程中,通过查找、替换或各种插件的功能对数据源进行更改,并在原单元格上覆盖保存。

    虽说此次的分析需求被满足了,但数据查找、替换过程中,也必然带来数据的丢失和变更。如简单一个转换大小写功能,处理成了全部大写,但哪天想看回原始的数据是怎样的,已经没法返回,或更有一些是一个信息量很大的单元格里,如上文的猪肉,3斤,油8两,青菜800克。。如果仅提取第1个猪肉的信息,后续,其他信息将无法还原。

    正确的做法是:使用函数公式,另起一列,通过函数公式的逻辑处理,从原来的数据中加工出最终想要的数据形式,例如Excel函数有转大写函数,用这个函数转一下,新列就是大写的,原来的数据还保留,可以追溯。

    很悲哀的是笔者也同样支持此类的文本处理功能,但实在呼吁,最好的方式是另起一列,用自定义函数实现(可能需要点正则的知识,多数人就打退膛鼓了)。

    10 中国式报表的大行其道

    制作带斜表头,各种交叉表、各种大小类小计手工引用多个单元格求和等等。报表出来就是一大张,A4纸都不够排,列数据有几十上百列,看得了这头忘记那头,看报表时当然要用聚光灯功能。同时打印出来要拿把尺子来比对不要看错行。

    以上林林总总,好像国有企业是个重灾区,领导要看的样式不敢不照做,多少生命就这样被领导着走一生。

    多用数据透视表吧,数据透视表不能满足的部分,就用数据表公式引用下结果数据,每月要更新报表,刷新下透视表,然后复制粘贴到PPT之类的排版下。


    End.
    作者:Excel催化剂

    来源:简书

    本文为转载分享,如有侵权请联系后台删除

    展开全文
  • 最近做的一个小例子,生成一年12个月的excel表格 # -*- coding:utf-8 -*- from xlwt import * from datetime import datetime import calendar def get_week_day(date): week_day = { 0: '星期一', 1: '星期二...

    最近做的一个小例子,生成一年12个月的excel表格

    # -*- coding:utf-8 -*-
    from xlwt import *
    from datetime import datetime
    import calendar
    
    def get_week_day(date):
        week_day = {
        0: '星期一',
        1: '星期二',
        2: '星期三',
        3: '星期四',
        4: '星期五',
        5: '星期六',
        6: '星期日',
        }
        day = date.weekday()
        return week_day[day]
    
    file = Workbook(encoding='utf-8')
    for i in range(1,13):
        table = file.add_sheet('2019年-%d月' % i)
        table.write(0, 0, '日期')
        table.write(0, 1, '上午')
        table.write(0, 2, '下午')
        table.write(0, 3, '出差')
        _, day_all = calendar.monthrange(2020, i)
        k = 0
        for j in range(1, day_all+1):
            date = datetime.strptime('2020/%d/%d'%(i, j), '%Y/%m/%d')
            week_str = get_week_day(date)
            s = '%02d月%02d号'%(i,j) +' ('+week_str+')'
            table.write(j, 0, s)
    file.save('2020-work.xls')

    简单的表格生成

     

    展开全文
  • 说明 本文可能需要一些基础知识点...(4)上面的月份,我们只画出1-12月 (5)点击时候弹出当天的提交情况,由一小三角和圆角矩形组成 需要解决的计算问题: (1)生成任意一年的所有天,包含年月日周,提交次数,色
  • 一年的数据分成了两段,1012月 10包含1031号以前所有的数据。 12月包含111号到12月31号的数据, 我现在想将两unl文件,导入导同一表里,使用脚本到会提示表格必须为空。 两unl文件字段,数据类型...
  • 通用万年历实验

    2021-03-24 00:10:12
    给定某年某某日是星期几,能给出任何一年12月)的输出。输出效果如下: 一 十一 十二 (这个表格,似乎没有达到想要的效果) 实验目的 掌握对...
  • D3.js上手——折线图

    2019-04-09 06:36:06
    表格数据是一家店铺一年的销售量 月份 销售量(件) 1 454 2 628 3 756 4 632 5 582 6 704 7 766 8 804 9 884 10 960 11 1095 12月 1250 ...
  • 1.计算年龄: ...当多个表格形式一致,如某医院每一年各部分的门诊情况,每个月份的表格记录完全一致,若做年底总结,需将12个表中数据综合,操作如下: 首先建立新表,复制某表格,删除其中的数据...
  • 点赞再看,养成习惯;...我们以一个同学12个月的月考成绩为例子,我们在月考趋势图上添加一条70分的参考线,来说明如何添加参考线以及解决其中遇到的问题。首先准备好成绩数据表格。 首先选中数据A1:...
  • 而k个月后损失的衣服是 件 举个例子,我们以n=3为例, 不考虑损失衣服的情形 考虑会损失衣服的情形 6 6 12 11 24 21 48 41 根据表格可以发现 对应每一个k值,损失的衣服为 件 因此...
  • EXCEL函数功能整理版

    2010-05-30 15:56:24
    42 DAYS360 按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在一些会计计算 43 DMAX 返回数据清单或数据库的列中满足指定条件的最大数值。 44 DMIN 返回...
  • 2.1.1 确保数据以表格形式布局 12 2.1.2 避免在分节标题中存储数据 12 2.1.3 避免重复组作为列 13 2.1.4 消除数据源中的空白和空单元格 13 2.1.5 应用适当的类型格式于字段 14 2.1.6 有效的数据源设计...
  • 2.1.1 确保数据以表格形式布局 12 2.1.2 避免在分节标题中存储数据 12 2.1.3 避免重复组作为列 13 2.1.4 消除数据源中的空白和空单元格 13 2.1.5 应用适当的类型格式于字段 14 2.1.6 有效的数据源设计...
  • 2.1.1 确保数据以表格形式布局 12 2.1.2 避免在分节标题中存储数据 12 2.1.3 避免重复组作为列 13 2.1.4 消除数据源中的空白和空单元格 13 2.1.5 应用适当的类型格式于字段 14 2.1.6 有效的数据源设计...
  • 2.1.1 确保数据以表格形式布局 12 2.1.2 避免在分节标题中存储数据 12 2.1.3 避免重复组作为列 13 2.1.4 消除数据源中的空白和空单元格 13 2.1.5 应用适当的类型格式于字段 14 2.1.6 有效的数据源设计...
  • 2011年1出版。 注:原书无书签。为了方便阅读,本人在上传前添加了完整的书签。 全书压缩打包成3部分,这是第2部分。 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但...
  • 2011年1出版。 注:原书无书签。为了方便阅读,本人在上传前添加了完整的书签。 全书压缩打包成3部分,这是第3部分。 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但...
  • 0.1.5版本 更新gantt日期支持 yearAndMonth、monthAndDay、yearAndWeek类型,并自动调整,规则为:大于12个月的自动调整为yearAndMonth,3个月到12个月之间的,自动调整为yearAndWeek, 2个月及以内的自动调整为month...
  • 实例007 使用正则表达式验证一年12个月份 实例008 使用正则表达式验证一个月的31天 实例009 使用正则表达式验证数字输入 实例010 使用正则表达式验证密码长度 实例011 使用正则表达式验证非零的正整数 实例...
  • 实例007 使用正则表达式验证一年12个月份 实例008 使用正则表达式验证一个月的31天 实例009 使用正则表达式验证数字输入 实例010 使用正则表达式验证密码长度 实例011 使用正则表达式验证非零的正整数 实例...
  • 2011年1出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发...
  • 2011年1出版。 全书压缩打包成4部分,这是第1部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发...
  • 2011年1出版。 全书压缩打包成4部分,这是第2部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发...
  • 2011年1出版。 全书压缩打包成4部分,这是第4部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发...
  • 在[系统维护]菜单中选择[结存]菜单,按系统提示操作即可,注意:结存将以最后一笔单据的日期作为结存的日期。结存将保留当月的“资产负债表”,“库存盘点表”,"经营情况表”,不会清空明细帐和单据,如需...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

一年12个月表格