同样首先先生成时序数据
import pandas as pd import numpy as np from datetime import datetime,timedelta test=pd.date_range('2020-05-09', periods=50,freq='H') #生成时间序列,期数是12,时间间隔按照分钟 test[1:10]
#构造时间序列数据 ts=pd.Series(np.arange(50),index=test) ts_df=pd.DataFrame(ts,columns=['数据']) ts_df=ts_df.reset_index().rename({'index':'Time','数据':'number'},axis=1) ts_df.head()
分析时间周期或者时序特征建模的时候有用
'''分析时间周期常用''' #年 ts_df['year']=ts_df['Time'].dt.year #月 ts_df['month']=ts_df['Time'].dt.month #日 ts_df['day']=ts_df['Time'].dt.day #周内第几日 ts_df['dayofweek']=ts_df['Time'].dt.dayofweek #小时 ts_df['Hour']=ts_df['Time'].dt.hour #分钟 ts_df['minute']=ts_df['Time'].dt.minute #秒 ts_df['second']=ts_df['Time'].dt.second print(ts_df.shape) ts_df.head(3)
ts_df.iloc[49,0]-ts_df.iloc[0,0]
Timedelta(‘2 days 01:00:00’)
print('原',ts_df.iloc[49,0]) print('后推10天',ts_df.iloc[49,0]+timedelta(10)) print('前推10天',ts_df.iloc[49,0]+timedelta(-10)) print('前推10天',ts_df.iloc[49,0]-timedelta(10))
timedelta函数:
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
其他操作:
#默认按天days print('原',ts_df.iloc[49,0]) print('向前推1天',ts_df.iloc[49,0]+timedelta(days=-1)) print('向前推10分钟',ts_df.iloc[49,0]+timedelta(minutes=-10)) print('向前推10小时',ts_df.iloc[49,0]+timedelta(hours=-10)) print('向前推1周',ts_df.iloc[49,0]+timedelta(weeks=-1))
resample函数:
参数: resample(freq, how=None, axis=0, fill_method=None, closed=None, label=None,convention='start',kind=None, loffset=None,limit=None,base=0) 参数解释: - rule:一般填写采样频率,如'M'、‘5min',Second(15) - how:用于产生聚合值的函数名或数组函数,例如'mean'、'ohlc'、'np.max'等,默认是'mean',其他常用的值由:'first'、'last'、'median'、'max'、'min' - axis:默认0,默认是纵轴,横轴设置axis=1 - fill_method:升采样时如何插值,比如'ffill'、'bfill'等 - closed:在降采样时,各时间段的哪一段是闭合的,'right'或'left',默认'right' - label:在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:30 - loffset:面元标签的时间校正值,比如‘-1s'或Second(-1)用于将聚合标签调早1秒 - limit:在向前或向后填充时,允许填充的最大时期数 - kind:聚合到时期('period')或时间戳('timestamp'),默认聚合到时间序列的索引类型 - convention:当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认'end'
应用:
ts_t=ts_df.set_index('Time') ts_temp=pd.DataFrame(ts_t['number']) ts_temp.head(10)
每三个小时采样:
ts_temp.resample('3H').sum()
此时第一个区间为2020-05-09 00:00:00~ 2020-05-09 02:00:00 所以sum=3(3个时间数据的聚合!) 第二个区间为2020-05-09 03:00:00~ 2020-05-09 05:00:00 所以sum=12 ... 默认使用左标签(label='left'),左闭合(closed='left')
现在再添加一个类别列,达到对每一个类别进行时间采样的目的:
ts_temp['type']=np.repeat(['A','B','C','D','E'],10) ts_temp
#先按照type分组,再按照时间采样 ts_temp.groupby('type').resample('3H').sum()#.reset_index()