目录

1.完整代码(部分参考:)

2.工作过程

 2.1输入

2.2过程 

3.实际效果


范例数据已经上传本站,有需要的同学在我发布的内容中自行下载。 

书接上回,在 NCDC气象数据的提取与处理(二)中,

我们成功将所需站点的isd-lite数据批量转为xlsx格式,形式如下:

一年一个文件夹,以年份命名; 

Python 全国站点气温等值线图_工作文件

 每个年份文件下,每个站点都有个表,文件名前6位是站点编号,倒数4位是年份

Python 全国站点气温等值线图_python_02

 点开后,最左边一列是时间(3小时一个间隔)

Python 全国站点气温等值线图_Python 全国站点气温等值线图_03

但上述数据往往不能满足我们的需求,一方面是有些数据列我们用不上,

同时更多的时候,我们需要的是逐日或着逐月的数据,

所以下面,我们要将这个次小时的数据表重采样(本文以重采集为逐日数据为例)

闲言少叙,先放代码,再讲工作过程:

1.完整代码(部分参考:)

import pandas as pd
import os
import openpyxl

def station_dailyTrans(rootdir): # 包含年份文件夹的上级文件夹
    read_folder = os.listdir(rootdir)
    for i in read_folder:
        read_list=[]
        if os.path.splitext(i)[-1]=="":  # 判断是否为文件夹
            for root, dirs, files in os.walk(f"{rootdir}\\{i}"):  # 获取所有文件
                for file in files:                                # 遍历所有文件名
                    if os.path.splitext(file)[-1] == '.xlsx':     # 获取所有xlsx文件绝对路径列表
                        read_list.append(os.path.join(root, file))  # 拼接出绝对路径并放入列表

            workbook = openpyxl.Workbook()       # 创建Workbook对象
            outfile_dir = f'{rootdir}\\{i}.xlsx'
            workbook.save(outfile_dir)          # 保存空的xlsx文件

            for read_data in read_list:
                station_code = os.path.split(read_data)[-1][0:6]  # 获取站点编号
                print("*"*10,station_code,"*"*10)
                data1=pd.read_excel(read_data,usecols=["Date","温度","露点温度","气压","风速"])
                data1=data1.set_index('Date')
                T_mean = data1.resample('d').mean() # mean取日均温,若处理降雨数据则为sum,日总降雨量
                T_max  = data1.resample('d').max()  # max取日最高温
                T_min  = data1.resample('d').min()  # min取日最低温
                """
                温度:    Tmean,Tmax,Tmin;[℃]
                露点温度:取日平均;[℃]
                气压:    取日平均;[hPa=100Pa]
                风速:    取日平均;[m/s]
                """
                # 创建一个新dataframe
                df = pd.DataFrame(columns=['T_max','T_min','T_mean','T_dew','P_mean','wind'],index=T_mean.index)
                df['T_mean'] = T_mean['温度'] 
                df['T_max']  = T_max ['温度'] 
                df['T_min']  = T_min ['温度'] 
                df['T_dew']  = T_mean['露点温度'] 
                df["P_mean"] = T_mean['气压'] 
                df['wind']   = T_mean['风速'] 

                #将excel写入对象writer
                writer = pd.ExcelWriter(outfile_dir, engine='openpyxl',mode='a')

                # 将各站点的数据表写入Excel中的sheet1、sheet2、sheet3……,sheet以站点编号命名
                df.to_excel(writer, sheet_name=station_code)

                # 保存读写的内容
                writer.save()
                print("bingo!",outfile_dir)
            wb = openpyxl.load_workbook(outfile_dir)      
            del wb['Sheet']                     # 删除新建Excel时默认的空表
            wb.save(outfile_dir)

2.工作过程

 2.1输入

上述代码定义了一个名为“station_dailyTrans()”的函数

要求输入:rootdir,工作文件夹路径,就是本文上来包含年份文件夹的上级路径

2.2过程 

step1. 根据输入的工作文件夹路径,遍历文件夹,读取文件夹中所有xlsx文件,(所以需要保证该文件夹中只存在站点小时数据的xlsx),并将xlsx文件路径存入列表 read_list


step2. 顺序读取列表 read_list中的文件,将我们需要的数据列和最前面的时间列提取为 dataframe(简写为df),再将df 按“日”尺度进行重采集,即对原数据提取日平均/最大/最小值,并将重采集后的 df 赋值给新的 df


step3. 以年份为名创建一个空的 xlsx文件,将上一步得到的站点重采集 df 写入空xlsx文件,且将sheet 以站点编号命名,直至同一年份文件中包含所有站点重采集后的 df

        本例中,重采集后的 “年份.xlsx”保存到 rootdir,即工作文件夹下。

3.实际效果

调用函数

rootdir = r'D:\china_climate_NCDC_trans_isd2excel' # 包含年份文件夹的上级文件夹            
station_dailyTrans(rootdir)

Python 全国站点气温等值线图_经验分享_04

  输出文件位置,文件以年份命名

 

Python 全国站点气温等值线图_python_05

打开后,文件最左列是“年-月-日”,sheet 以站点代码命名

Python 全国站点气温等值线图_经验分享_06

Python 全国站点气温等值线图_python_07