数据说明
数据来自 2010年中国地面气候资料日值数据集(V3.0) 中国气象数据网
数据集实体文件名称:
数据文件命名由数据集代码(SURF_CLI_CHN_MUL_DAY)、要素代码(XXX)、项目代码(XXXXX)、年份标识(YYYY)和月份标识(MM)组成。其中,SURF表示地面气象资料,CLI表示地面气候资料,CHN表示中国,MUL表示多要素,DAY表示日值数据。
XXX-XXXXX说明:PRS-10004表示本站气压,TEM-12001表示气温,RHU-13003表示相对湿度,PRE-13011表示降水,EVP-13240表示蒸发,WIN-11002表示风向风速,SSD-14032表示日照,GST-12030-0cm表示0cm地温。
文件命名为:
1. 本站气压:SURF_CLI_CHN_MUL_DAY-PRS-10004-YYYYMM.TXT
2. 气温:SURF_CLI_CHN_MUL_DAY-TEM-12001-YYYYMM.TXT
3. 相对湿度:SURF_CLI_CHN_MUL_DAY-RHU-13003-YYYYMM.TXT
4. 降水:SURF_CLI_CHN_MUL_DAY-PRE-13011-YYYYMM.TXT
5. 蒸发:SURF_CLI_CHN_MUL_DAY-EVP-13240-YYYYMM.TXT
6. 风向风速:SURF_CLI_CHN_MUL_DAY-WIN-11002-YYYYMM.TXT
7. 日照:SURF_CLI_CHN_MUL_DAY-SSD-14032-YYYYMM.TXT
8. 0cm地温:SURF_CLI_CHN_MUL_DAY-GST-12030-0cm-YYYYMM.TXT
本次只选用了12个月份日值地温数据:
数据格式说明和数据内容如下:
根据数据格式说明文档可知,上图中标记的两列分别问日均值地温和日均值地温质量控制码。
处理目的/过程
处理的目的是得到 2010年的年平均地温,因此需要对12个月份txt文件的日均值地温根据台站号进行批量处理得到12个月份的月均值地温,最后得到2010年的年平均地温数据。
代码
运行前将txt文档单独放在一个文件夹中,文件夹中不能有其他格式的文件。
import os
import pandas as pd
os.chdir(r'E:\pytest\2010年日平均低温')
l = os.listdir(r'E:\pytest\2010年日平均低温')
#如下读取可获得Data_GST_20100* 12个单独的变量,后面批量处理并不方便
'''
names = locals()
for i in range(len(l)):
io = l[i]
names['Data_'+l[i][21:24]+'_'+l[i][-10:-4]] = pd.read_csv(io,sep='\s+',header=None)
#根据第10列的质量控制码 筛选出正确数据
Data_GST_201001=Data_GST_201001[Data_GST_201001[10].isin([0])]
#判断数据是否正确 然后求均值
if Data_GST_201001[10].max() == 0:
group = Data_GST_201001.groupby([0])[7].mean()*0.1 #平均温度求均值并把单位转换为摄氏度
'''
#如下读取可得到data列表 包括12个月份数据的dataframe,后面方便进行批处理
data = []
for i in range(len(l)):
io = l[i]
data.append(pd.read_table(io,sep='\s+',header=None))
'''
质量控制码 含义
0 数据正确
1 数据可疑
2 数据错误
8 数据缺测或无观测任务
9 数据未进行质量控制
11 平均地表气温质量控制码
8 平均地表气温 Number(7) 0.1℃
'''
#根据第10列的质量控制码 筛选出正确数据
for i in range(len(data)):
data[i] = data[i][data[i][10].isin([0])]
#判断数据是否正确 然后求均值
qa=0
for i in range(len(data)):
if data[i][10].max() == 0:
qa = 1
if qa == 1:
#接下来按照台站号批量求每月气温均值 并转换为℃
month_lst = []
for i in range(len(data)):
month_lst.append(data[i].groupby([0])[7].mean()*0.1)
#接下来按照台站号求年平均气温
yearsum_lst = month_lst[0]
for i in range(len(data)):
yearsum_lst += month_lst[i]
yearmean_lst = yearsum_lst/12
#yearmean_lst.to_excel('2010yearmean_lst.xlsx')
print('END!')
#写出excel表格数据
else:
for i in range(len(data)):
if data[i][10].max() == 0:
print('{}月数据合格'.format(i+1))
else:
print('{}月数据不合格'.format(i+1))
#接下来添加站点经纬度数据
#首先提取站点经纬度
location = data[0].iloc[:,0:3].groupby([0]).mean() / 100
location.columns = ['Y','X']
#location.to_excel('location.xlsx')
X = location.loc[:,'X']
Y = location.loc[:,'Y']
#提取站点海拔高度
height = data[0].groupby([0])[3].mean() / 10
#写出数据
final_data = pd.DataFrame({'X':X,'Y':Y,'年均地温':yearmean_lst,'海拔高度':height})
final_data.to_excel('2010yearmean_lst.xlsx')
处理结果
2020-5-13-10:24更新
处理日值降水数据得到年总降水量数据。
import os
import pandas as pd
os.chdir(r'E:\pytest\2010年日降水量')
l = os.listdir(r'E:\pytest\2010年日降水量')
#如下读取可得到data列表 包括12个月份数据的dataframe,后面方便进行批处理
data = []
for i in range(len(l)):
io = l[i]
data.append(pd.read_table(io,sep='\s+',header=None))
#根据第10列的质量控制码 筛选出正确数据
for i in range(len(data)):
data[i] = data[i][ data[i][10].isin([0]) ]
data[i] = data[i][ ~data[i][7].isin([32700])]
#判断数据是否正确 然后求均值
qa = 0
for i in range(len(data)):
if data[i][10].max() == 0 and data[i][7].max() < 32700 :
qa = 1
if qa == 1:
#接下来按照台站号批量求每月降水总量 并转换为mm
month_pre = []
for i in range(len(data)):
month_pre.append( data[i].groupby([0])[7].sum() )
#接下来按照台站号求年总降水量
yearsum_pre = month_pre[0]
for i in range(len(data)):
yearsum_pre += month_pre[i]
print('END!')
#写出excel表格数据
else:
for i in range(len(data)):
if data[i][10].max() == 0:
print('{}月数据合格'.format(i+1))
else:
print('{}月数据不合格'.format(i+1))
#接下来添加站点经纬度数据
#首先提取站点经纬度
location = data[0].iloc[:,0:3].groupby([0]).mean() / 100
location.columns = ['Y', 'X']
#location.to_excel('location.xlsx')
X = location.loc[:, 'X']
Y = location.loc[:, 'Y']
#提取站点海拔高度
height = data[0].groupby([0])[3].mean() / 10
#写出数据
final_data = pd.DataFrame({'X':X,'Y':Y,'年总降水量':yearsum_pre,'海拔高度':height})
final_data.to_excel('2010year_sumPre.xlsx')