目录
1.完整代码(部分参考:http://t.csdn.cn/Z4kWA)
2.工作过程
2.1输入
2.2过程
3.实际效果
书接上回,在 NCDC气象数据的提取与处理(二)中,
我们成功将所需站点的isd-lite数据批量转为xlsx格式,形式如下:
一年一个文件夹,以年份命名;
每个年份文件下,每个站点都有个表,文件名前6位是站点编号,倒数4位是年份
点开后,最左边一列是时间(3小时一个间隔)
但上述数据往往不能满足我们的需求,一方面是有些数据列我们用不上,
同时更多的时候,我们需要的是逐日或着逐月的数据,
所以下面,我们要将这个次小时的数据表重采样(本文以重采集为逐日数据为例)
闲言少叙,先放代码,再讲工作过程:
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)
上述代码定义了一个名为“station_dailyTrans()”的函数
要求输入:rootdir,工作文件夹路径,就是本文上来包含年份文件夹的上级路径
step1. 根据输入的工作文件夹路径,遍历文件夹,读取文件夹中所有xlsx文件,(所以需要保证该文件夹中只存在站点小时数据的xlsx),并将xlsx文件路径存入列表 read_list
step2. 顺序读取列表 read_list中的文件,将我们需要的数据列和最前面的时间列提取为 dataframe(简写为df),再将df 按“日”尺度进行重采集,即对原数据提取日平均/最大/最小值,并将重采集后的 df 赋值给新的 df
step3. 以年份为名创建一个空的 xlsx文件,将上一步得到的站点重采集 df 写入空xlsx文件,且将sheet 以站点编号命名,直至同一年份文件中包含所有站点重采集后的 df
本例中,重采集后的 “年份.xlsx”保存到 rootdir,即工作文件夹下。
调用函数
rootdir = r'D:\china_climate_NCDC_trans_isd2excel' # 包含年份文件夹的上级文件夹
station_dailyTrans(rootdir)
输出文件位置,文件以年份命名
打开后,文件最左列是“年-月-日”,sheet 以站点代码命名