python气象数据处理实例:构造自定义时间索引(时间戳)/r站点日均转月均/dataframe添加时间索引(datetimeindex)

背景与数据

pandas作为python里常用的时间序列分析库,在气象数据处理中有着极为广泛地应用,其resample功能可以轻松地将不同频率时间序列转换,这正好满足气象中需要求日均、月均、甚至季节平均的需要,但是,resample需要其序列(series)或数据框(dataframe)具有时间索引,可在一些气象站点数据中,时间索引需要我们自己构建添加,而这些时间点并不均匀分布——换句话说,在某些时间点,数据缺失,这时需要我们自己构建时间日期,并添加至dataframe成为时间索引,再使用resample采样。
下面我将以Barrow站点2018年小时气象数据为例,讲解我的做法,数据来源:Barrow-in-situ-hourly
数据长这样:
python气象数据处理实例:构造自定义时间索引(时间戳)/r站点日均转月均/dataframe添加时间索引(datetimeindex)_第1张图片
逐小时气象数据,全年放在一个txt文件里。
读取至python时,发现它只有8184列,而不是365×24=8760,同时,时间是以四列组成:年、月、日、时。

构建时间戳

首先读取数据,把月日时提取出来:

import os
import numpy as np
import xarray as xr
import pandas as pd
import datetime as dt
import time
os.chdir('D:/arctic-in-situ/')
bar=pd.read_table('met_Barrow_hour_2018.txt',sep='\s+',header=None,index_col=(0))
mon=to_np(bar.iloc[:,1])
day=to_np(bar.iloc[:,2])
hour=to_np(bar.iloc[:,3])

构建datename数据:

bar_date={}
for i in range(0,8184):
    bar_date[i]=dt.datetime(2018,mon[i],day[i],hour[i])

此时,bar_date为字典类型,为了方便插入,我们将其转换类型,否则会出错:

#添加时间戳\
bar_date=pd.Series(bar_date)
bar_date=bar_date.tolist()
bar.insert(0, 'date', None)
bar['date']=bar['date'].astype('datetime64[ns]')
bar['date']=bar_date

构建时间索引

bar=bar.set_index('date')#将date作为标签
bar.index=pd.DatetimeIndex(bar.index)#将标签转为时间索引
bar.axes#查看

python气象数据处理实例:构造自定义时间索引(时间戳)/r站点日均转月均/dataframe添加时间索引(datetimeindex)_第2张图片
python气象数据处理实例:构造自定义时间索引(时间戳)/r站点日均转月均/dataframe添加时间索引(datetimeindex)_第3张图片
数据与时间索引。

计算

接下来使用resample计算就行啦,可以根据需要求日均、月均、季节,比如这里我求了月均:

bar_mave=bar.resample('M').mean()

得到:
python气象数据处理实例:构造自定义时间索引(时间戳)/r站点日均转月均/dataframe添加时间索引(datetimeindex)_第4张图片
解决。
完整代码:

import os
import numpy as np
import xarray as xr
import pandas as pd
import datetime as dt
import time
os.chdir('D:/arctic-in-situ/')
bar=pd.read_table('met_Barrow_hour_2018.txt',sep='\s+',header=None,index_col=(0))
mon=to_np(bar.iloc[:,1])
day=to_np(bar.iloc[:,2])
hour=to_np(bar.iloc[:,3])
#构建时间戳
bar_date={}
for i in range(0,8184):
    bar_date[i]=dt.datetime(2018,mon[i],day[i],hour[i])
#添加时间戳\
bar_date=pd.Series(bar_date)
bar_date=bar_date.tolist()
bar.insert(0, 'date', None)
bar['date']=bar['date'].astype('datetime64[ns]')
bar['date']=bar_date
bar=bar.set_index('date')#将date作为标签
bar.index=pd.DatetimeIndex(bar.index)#将标签转为时间索引
bar.axes#查看
bar_mave=bar.resample('M').mean()

你可能感兴趣的:(python,笔记,python,r语言,pandas)