
本文详解如何使用 pandas 的 resample().agg() 方法,在单次操作中对时间序列数据按日(或其他频率)同时计算多个聚合指标(如 price 和 vol 的均值与最大值),避免重复重采样,提升代码效率与可读性。
本文详解如何使用 pandas 的 `resample().agg()` 方法,在单次操作中对时间序列数据按日(或其他频率)同时计算多个聚合指标(如 price 和 vol 的均值与最大值),避免重复重采样,提升代码效率与可读性。
在处理金融、物联网或传感器等时间序列数据时,常需按固定周期(如每日、每小时)提取多维度统计特征——例如既需要某资产的日均价格和日均成交量,又需其当日最高价和当日最大成交量。若分别调用 .resample('1D').mean() 和 .resample('1D').max(),不仅代码冗余,还会触发两次独立的重采样计算,降低性能且易引发索引对齐问题。
幸运的是,pandas 提供了高度灵活的聚合接口:resample(...).agg() 支持为不同列指定不同的聚合函数,甚至为同一列应用多个函数。核心方案如下:
import pandas as pd
# 构建示例数据(含 datetime 索引)
df = pd.DataFrame({
'price': [56, 70, 92, 94, 81, 70, 56, 68, 59, 86],
'vol': [1544, 1680, 1853, 1039, 1180, 1443, 1621, 1093, 1684, 1591]
}, index=pd.to_datetime([
'2017-01-01 08:00:00', '2017-01-01 11:00:00', '2017-01-01 14:00:00',
'2017-01-02 08:00:00', '2017-01-02 11:00:00', '2017-01-02 14:00:00',
'2017-01-03 08:00:00', '2017-01-03 11:00:00', '2017-01-03 14:00:00',
'2017-01-04 08:00:00'
]))
# 单次重采样 + 多函数聚合:为 price 和 vol 分别计算 mean 与 max
result = df.resample('1D').agg({
'price': ['mean', 'max'],
'vol': ['mean', 'max']
})
# 扁平化列名,符合预期输出格式(price_mean, price_max, vol_mean, vol_max)
result.columns = ['price_mean', 'price_max', 'vol_mean', 'vol_max']
print(result)
输出结果为:
price_mean price_max vol_mean vol_max 2017-01-01 72.666667 92 1692.333333 1853 2017-01-02 81.666667 94 1220.666667 1443 2017-01-03 61.000000 68 1466.000000 1684 2017-01-04 86.000000 86 1591.000000 1591
✅ 关键要点说明:
- agg({...}) 接收字典,键为列名,值为函数列表(支持字符串如 'mean',也可传入自定义函数);
- 聚合后列名为 MultiIndex(如 ('price', 'mean')),需通过 columns = [...] 显式重命名以获得扁平、语义清晰的列结构;
- 时间频率字符串(如 '1D')支持多种格式:'D'(日)、'H'(小时)、'W'(周)、'MS'(月初)等,详见 pandas offset aliases;
- 若需更多统计量(如 min, std, count),只需在对应列表中追加即可,例如 'price': ['mean', 'max', 'min', 'std']。
⚠️ 注意事项:
- 输入 DataFrame 的索引必须是 datetime 类型(pd.DatetimeIndex),否则 resample() 将报错;可通过 df.index = pd.to_datetime(df.index) 强制转换;
- 对于缺失时间点(如某日无数据),resample().agg() 默认返回 NaN,如需填充可用 .fillna() 或 .asfreq() 配合插值策略;
- 若需保留原始时间戳信息(如取最大值对应的原始时间),应改用 resample().apply() 结合 idxmax() + loc 实现,但会牺牲部分性能。
综上,resample().agg() 是实现高效、可读、可扩展时间序列多指标聚合的首选方案——一次重采样,多重洞察。










