参考书目:《深入浅出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美国线
#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()