python时序数据处理2--提取年月信息、时间作差等

同样首先先生成时序数据

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]

python时序数据处理2--提取年月信息、时间作差等

#构造时间序列数据
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()

python时序数据处理2--提取年月信息、时间作差等

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)

python时序数据处理2--提取年月信息、时间作差等

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))

python时序数据处理2--提取年月信息、时间作差等
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))    

python时序数据处理2--提取年月信息、时间作差等

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)

python时序数据处理2--提取年月信息、时间作差等
每三个小时采样:

ts_temp.resample('3H').sum()

python时序数据处理2--提取年月信息、时间作差等

此时第一个区间为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

python时序数据处理2--提取年月信息、时间作差等

#先按照type分组,再按照时间采样
ts_temp.groupby('type').resample('3H').sum()#.reset_index()

python时序数据处理2--提取年月信息、时间作差等

上一篇:《Python数据分析与挖掘实战》第10章(下)——DNN2 筛选得“候选洗浴事件”3 构建模型


下一篇:数据可视化基础专题(十八):Pandas120题(三)21-50