1、数据:美国国家气候数据中心-中国各个气象站1942-2021的每日的气温、降水量等数据。
全国气象台站经纬度海拔信息。
2、处理思路:
预备条件,每年的数据已解压
首先,遍历每个文件夹所有文件,提取出站点、日期、气温、降雨量等信息。关键点:1)建立字典存储每个站点对应的省份,以映射添加省份变量;2)数据清洗:降雨量为负值、-999缺失值等处理,新建DataFrame(res)存储这一年的所有站点数据。
然后,对这一年的所有站点数据,依据省份、日期分组求出每个省每日气温最大、最小值;降雨量的平均值。只保存我们需要的信息,并进行降重。
这部分代码如下:
import os
import os.path
import codecs
import pandas as pd
import numpy as np
#关于数据每列含义,参考NCDC数据说明
column_name = ["年","月","日","时","气温","露点温度","海平面气压","风向","风速率","天空状况总覆盖码","小时降雨量","六小时降雨量",]
# 存储区位号对应的省份
data1=pd.read_excel('全国气象台站经纬度海拔信息(1).xlsx')
data1['区站号']=data1['区站号'].astype('str')
sta_dict=data1[["区站号", "省份"]].set_index("区站号").to_dict(orient='dict')["省份"]
folders = os.listdir()#存放当前文件夹列表
res = pd.DataFrame()
for folder in folders: # 以年为单位进行遍历处理
if os.path.splitext(folder)[-1] == "": # 通过后缀判断文件是否为文件夹
if folder=='.ipynb_checkpoints':# .ipynb_checkpoints不进行处理
continue
else:
for root,dirs,files in os.walk(folder):
print(root)
for name in files:
filePath=os.path.join(root,name)
stationid = name[:5]
print(filePath)
#文件读取
f=codecs.open(filePath,'r')
# 设置列名和 默认以多个空格来识别数据
data = pd.read_csv(f, sep='\s+', names=column_name)
#行数
datarow = data.shape[0]
data["站点"] = [stationid]*datarow
#去除缺失值
data = data[~data['气温'].isin([-9999])]
data['年']=data['年'].astype('str')
data['月']=data['月'].astype('str')
data['日']=data['日'].astype('str')
data['站点']=data['站点'].astype('str')
# 对数据中-9999的缺失值进行NaN替换
data = data.replace(-9999,0)
# 数据说明文档中表示原始数据中温度、露点温度、
# 气压、风速、降雨量的换算系数为10,
# 所以要对原始数据中的对应数据除以10,进行换算。
data['气温'] = data['气温']/10
data['六小时降雨量'] = data['六小时降雨量']/10
data["日期"] = pd.to_datetime(data['年'] + '-' +data['月'] + '-' + data['日'])
data['省份']=data['站点'].map(sta_dict)
# print(data)
tmp=data[['省份','日期','气温','六小时降雨量']]
tmp=tmp.dropna(subset=['省份'])
tmp['六小时降雨量']=tmp['六小时降雨量'].mask(tmp['六小时降雨量'] < 0, 0)
res=pd.concat([res,tmp])
res['最高气温'] = res.groupby(['省份', '日期'])['气温'].transform('max')
res['最低气温'] = res.groupby(['省份', '日期'])['气温'].transform('min')
res['平均降雨量']=res.groupby(['省份', '日期'])['六小时降雨量'].transform('mean')
res=res[['省份','日期','最高气温','最低气温','平均降雨量']]
res=res.drop_duplicates()
res.to_csv(folder+'.csv',index=False,encoding="utf_8_sig")
res = pd.DataFrame()
最后,把所有省份的数据放入一个文件夹中,提取出每个省1989-2020每日气温、降雨量信息。
import pandas as pd
import os
files=os.listdir()#存放每年结果
res = pd.DataFrame()#存放所有年份结果
count=0
for file in files:
if os.path.splitext(file)[-1]=='.csv':
data = pd.read_csv(file)
print(data.shape[0])
count+= data.shape[0]
res=pd.concat([res,data],axis=0)
tmp=res['省份'].unique()
DataFrameDict = {elem : pd.DataFrame() for elem in tmp}
#遍历得到每个省的信息
for key in DataFrameDict.keys():
tmp1= res[:][res.省份 == key]
tmp1=tmp1.sort_values(by='日期',ascending=True,axis=0)
tmp1['日期']=pd.to_datetime(tmp1['日期'])
tmp1['年']=tmp1['日期'].dt.year
tmp1['月']=tmp1['日期'].dt.month
tmp1['日']=tmp1['日期'].dt.day
tmp1=tmp1.replace(0, '-99.9')
tmp1=tmp1[['年','月','日','最低气温','最高气温','平均降雨量']]
print(tmp1.head())
# tmp1.to_excel(key+'.xlsx',index=False)
# import csv
tmp1.to_csv(key+'.txt', sep=' ', index=False,quoting=csv.QUOTE_NONE,escapechar=' ')
Note:个人技术有限,各位看官发现代码存在错误,烦请指出,谢谢!