pandas处理数据的时候,可能会遇到分组问题,比如说一组统计数据需要按周分组统计,这时候利用DataFrame中的resample
函数就会非常方便与优雅。
本文简单介绍resample
函数的一些入门使用方法,方便后来者参考~
官方帮助文档
resample
函数的官方介绍可参考https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
实例说明
# 导入上图中的数据
>>> df = pd.read_excel(r'resample_data.xlsx')
# 以一周内第一天最为一条记录
>>> df.resample("W", on="date").first()
date open high weekday
date
2022-04-17 2022-04-11 9620.50 9644.11 0
2022-04-24 2022-04-18 9473.89 9508.39 0
2022-05-01 2022-04-25 8707.82 8728.92 0
2022-05-08 2022-05-05 8720.32 8883.65 3
2022-05-15 2022-05-09 8761.02 8851.00 0
2022-05-22 2022-05-16 9159.94 9172.02 0
2022-05-29 2022-05-23 8985.73 9005.87 0
# 以一周内最后一天最为一条记录
>>> df.resample("W", on="date").last()
date open high weekday
date
2022-04-17 2022-04-15 9460.91 9643.38 4
2022-04-24 2022-04-22 8839.38 8920.13 4
2022-05-01 2022-04-29 8461.67 8750.18 4
2022-05-08 2022-05-06 8650.90 8838.78 4
2022-05-15 2022-05-13 9158.55 9211.67 4
2022-05-22 2022-05-20 8825.58 8976.35 4
2022-05-29 2022-05-25 8572.11 8693.04 2
# 分组聚合,open列取第一天的值,high列取一周内最大值
>>> df.resample("W", on="date").agg({'open':'first', 'high':'max'})
open high
date
2022-04-17 9620.50 9694.81
2022-04-24 9473.89 9508.39
2022-05-01 8707.82 8750.18
2022-05-08 8720.32 8883.65
2022-05-15 8761.02 9211.67
2022-05-22 9159.94 9172.02
2022-05-29 8985.73 9005.87
# 分组聚合,自定义聚合函数
df.resample("W", on="date").agg({'open':'first', 'high': lambda x: max(x) + 2})
open high
date
2022-04-17 9620.50 9696.81
2022-04-24 9473.89 9510.39
2022-05-01 8707.82 8752.18
2022-05-08 8720.32 8885.65
2022-05-15 8761.02 9213.67
2022-05-22 9159.94 9174.02
2022-05-29 8985.73 9007.87
遇到的问题
TypeError: Only valid with DatetimeIndex, Timedelta,but got an instance of 'Index'
该错误是resample所触发的,主要意思是对于函数中的on
对应的那一列(默认为索引)应该为datetime类型,所以需要将该列转换为时间类型就可以了。
# 如果是索引
data.index = pd.to_datetime(data.index)
# 如果是普通列
df['date'] = pd.to_datetime(df['date'])
参考:resample()错误TypeError: Only valid with DatetimeIndex, Timedelta,but got an instance of 'Index'【已解决】