数据说明

数据来自 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')
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐