美国国家NCDC气候数据处理-提取中国各省最高气温、最低气温、降雨量信息。

1、数据:美国国家气候数据中心-中国各个气象站1942-2021的每日的气温、降水量等数据。

美国国家NCDC气候数据处理-提取中国各省最高气温、最低气温、降雨量信息。_第1张图片

         全国气象台站经纬度海拔信息。

美国国家NCDC气候数据处理-提取中国各省最高气温、最低气温、降雨量信息。_第2张图片

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:个人技术有限,各位看官发现代码存在错误,烦请指出,谢谢!

 

你可能感兴趣的:(python,数据分析)