
本文介绍如何在 Pandas 中结合时间切片(如每5分钟)和多级分组(如 time.floor('5T') 与 price),对 volume 字段进行累计求和,并筛选出首次突破指定阈值(如 100)的时间点。
本文介绍如何在 pandas 中结合时间切片(如每5分钟)和多级分组(如 `time.floor('5t')` 与 `price`),对 `volume` 字段进行累计求和,并筛选出首次突破指定阈值(如 100)的时间点。
在金融或高频交易数据分析中,常需按固定时间窗口(如 5 分钟)对行情数据分组,并在组内按价格档位进一步细分,再计算成交量的滚动累计和,以识别关键成交节点(例如“累计成交量首次超过 100 的时刻”)。Pandas 提供了强大且高效的 groupby().cumsum() 方法来实现这一目标。
首先,需将字符串时间列转换为 datetime 类型,以便使用 .dt.floor('5T') 进行向下取整到最近的 5 分钟边界(如 '10:02' → '10:00','10:06' → '10:05'):
import pandas as pd
data = {
'time': ['10:00', '10:01', '10:02', '10:02', '10:03', '10:04', '10:06', '10:10', '10:15'],
'price': [100, 101, 101, 103, 101, 101, 105, 106, 107],
'volume': [50, 60, 30, 80, 20, 50, 10, 40, 40]
}
df = pd.DataFrame(data)
df['time'] = pd.to_datetime(df['time'], format='%H:%M') # 转为 datetime
接着,使用双重分组键:df['time'].dt.floor('5T')(5 分钟时间桶)与 'price',对 'volume' 执行 组内累计求和(非全局 sum,而是逐行累加):
df['cum_volume'] = (
df.groupby([df['time'].dt.floor('5T'), 'price'])['volume']
.cumsum()
)
⚠️ 注意事项:
- '5T' 和 '5min' 等价,但推荐统一使用 '5T'(表示 5 分钟周期);
- cumsum() 是组内有序累计,结果依赖原始 DataFrame 的行序;若时间未排序,请先执行 df.sort_values('time', inplace=True);
- 分组键中若含缺失值(NaN),对应行将被自动排除在分组外,需提前清洗。
生成的 cum_volume 列即为每个 (5分钟窗口, 价格) 组内的实时累计成交量。例如:
- 时间 '10:00'–'10:04' 属于 '10:00' 时间桶;
- 其中 price=101 的记录有三行(10:01, 10:02, 10:03, 10:04),cum_volume 值依次为 60 → 90 → 110 → 160;
- 首次超过 100 发生在 '10:03'(值为 110),符合题目要求。
最后,直接用布尔索引或 query() 筛选满足条件的记录:
result = df[df['cum_volume'] > 100]
# 或
# result = df.query('cum_volume > 100')
print(result[['time', 'price', 'volume', 'cum_volume']])
输出:
time price volume cum_volume 4 2024-04-06 10:03:00 101 20 110 5 2024-04-06 10:04:00 101 50 160
✅ 总结:该方案核心在于理解 groupby(...).cumsum() 与 groupby(...).sum() 的本质区别——前者保留原始行结构并逐行累加,后者压缩为聚合行。结合时间切片与多字段分组,即可精准定位业务关键阈值触发点,适用于订单流分析、流动性监测等场景。











