参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》
pandas对数据可以进行频率的更改,比如将每五分钟的数据改为每分钟的数据,或者将高频的小时数据改为日期数据,都很方便。主要依赖resample()方法。
还是先导入包
- import numpy as np
- import pandas as pd
- import datetime
- #解析时间
- pd.Timestamp('now').strftime('%Y年%m月%d日')
- pd.to_datetime('2022*11*12',format='%Y*%m*%d')
#resample() 是一个基于时间的分组依据,后面是每个分组的聚合方法。
- rng = pd.date_range('1/1/2012', periods=1000, freq='S')
- ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
- ts
原始数据是一秒钟一条
# 每5分钟进行一次聚合
ts.resample('5Min').sum()
#重采样功能非常灵活,可以指定许多不同的参数来控制频率转换和重采样操作。
#通过分派可用的任何函数(类似于 grouby)都可以作为返回对象的方法,包括 sum,mean,std,sem,max,min,mid,median,first,last,ohlc:
- ts.resample('5Min').mean() # 平均
- ts.resample('5Min').max() # 最大值
#ohlc类似股票的K线,蜡烛图,能展示这个区间的开始值,最高值,最低值,收盘值
ts.resample('5Min').ohlc()
#开闭区间指定
- #对于采样,可以将 closed 设置为“ left”或“ right”,以指定关闭区间的哪一端:
- ts.resample('5Min', closed='right').mean()
- ts.resample('5Min', closed='left').mean()
#把数据扩充到更高的时间频率
#对于上采样,您可以指定一种上采样的方法,并指定 limit 参数以对创建的间隙进行插值:
- # 从每秒到每250毫秒
- ts.resample('250L').asfreq()
填充
- ts.resample('250L').ffill()
- ts.resample('250L').bfill(limit=2)
#类似于 aggregating API, groupby API, 和窗口方法 api, Resampler 也适用相关方法。重新采样DataFrame时,默认值是对具有相同功能的所有列进行操作:
- df = pd.DataFrame(np.random.randn(1000, 3),index=pd.date_range('1/1/2012', freq='S', periods=1000),columns=['A', 'B', 'C'])
- r = df.resample('3T')
- r.mean()
选取部分列
- r['A'].mean()
- r[['A', 'B']].mean()
#多个聚合方式:
- #多个聚合方式:
- r['A'].agg([np.sum, np.mean, np.std])
- r.agg([np.sum, np.mean]) # 每个列
- # 不同的聚合方式
- r.agg({'A': np.sum,
- 'B': lambda x: np.std(x, ddof=1)})
- # 用字符指定
- r.agg({'A': 'sum', 'B': 'std'})
- r.agg({'A': ['sum', 'std'], 'B': ['mean', 'std']})
#如果索引不是时间,可以指定采样的时间列:
- # date 是一个普通列
- df.resample('M', on='date').sum()
- df.resample('M', level='d').sum() # 多层索引
#本文介绍不同时间概念之间的相互转换。带时间戳的数据可以使用 to_period 转换为PeriodIndex-ed 数据,反之亦然可以使用 to_timestamp 转换为 PeriodIndex-ed 数据。
- rng = pd.date_range('1/1/2012', periods=5, freq='M')
- ts = pd.Series(np.random.randn(len(rng)), index=rng)
- ts
- ps = ts.to_period()
- ps
ps.to_timestamp()