同样首先先生成时序数据
1.生成时序数据
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()
2. 提取年月日等信息
分析时间周期或者时序特征建模的时候有用
'''分析时间周期常用'''
#年
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)
3.时间作差
- 直接相减
ts_df.iloc[49,0]-ts_df.iloc[0,0]
Timedelta(‘2 days 01:00:00’)
- 使用timedelta
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))
4.时间采样
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()