
本文介绍如何在 pandas 中结合时间切片(如每5分钟)和多级分组(如价格),对交易数据的成交量进行累计求和,并快速筛选出累计值首次突破阈值(如100)的时间点。
本文介绍如何在 pandas 中结合时间切片(如每5分钟)和多级分组(如价格),对交易数据的成交量进行累计求和,并快速筛选出累计值首次突破阈值(如100)的时间点。
在金融或高频交易数据分析中,常需按固定时间窗口(如5分钟)对订单流进行聚合分析。但若仅用 groupby(...).sum() 会丢失原始时间粒度;而业务上往往关注“累积到何时触发某阈值”,例如:同一价格档位下,5分钟窗口内成交量逐笔累加,首次超过100的时刻即为关键信号。
下面以真实示例演示完整流程:
✅ 步骤一:构造带时间索引的 DataFrame
首先将字符串时间转为 datetime 类型,便于后续时间运算:
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('2024-04-06 ' + df['time']) # 补全年月日,生成 datetime64
⚠️ 注意:dt.floor('5T')(或 '5min')要求列必须是 datetime64 类型,否则会报错。
✅ 步骤二:按5分钟窗口 + 价格分组,计算累计成交量
使用 groupby().cumsum() 实现组内逐行累加,保留原始行结构,不压缩数据:
df['cum_volume'] = (
df.groupby([df['time'].dt.floor('5T'), 'price'])['volume']
.cumsum()
)
该操作逻辑为:
- 先将 time 向前舍入至最近的5分钟边界(如 '10:02' → '10:00','10:06' → '10:05');
- 再与 price 组成复合键,对每个 (5分钟窗口, 价格) 子组独立累计 volume;
- 结果写入新列 cum_volume,每一行代表截至当前行、该价格在对应窗口内的累计成交量。
执行后 df 如下(简化显示):
| time | price | volume | cum_volume |
|---|---|---|---|
| 2024-04-06 10:00:00 | 100 | 50 | 50 |
| 2024-04-06 10:01:00 | 101 | 60 | 60 |
| 2024-04-06 10:02:00 | 101 | 30 | 90 |
| 2024-04-06 10:02:00 | 103 | 80 | 80 |
| 2024-04-06 10:03:00 | 101 | 20 | 110 |
| 2024-04-06 10:04:00 | 101 | 50 | 160 |
✅ 步骤三:筛选首次突破阈值的记录
直接用布尔索引或 query() 提取所有 cum_volume > 100 的行:
result = df[df['cum_volume'] > 100]
# 或等价写法:
# result = df.query('cum_volume > 100')
输出即为满足条件的最早时间点及后续延续记录(符合“累计过程”语义):
| time | price | volume | cum_volume |
|---|---|---|---|
| 2024-04-06 10:03:00 | 101 | 20 | 110 |
| 2024-04-06 10:04:00 | 101 | 50 | 160 |
? 进阶提示:若只需“每个价格-窗口组合中首次超限的时间”,可进一步去重:
first_over_100 = df[df['cum_volume'] > 100].drop_duplicates(
subset=['time', 'price'], keep='first'
)
✅ 总结
- ✅ groupby(...).cumsum() 是解决“分组内顺序累计”问题的核心方法,优于先 sum() 再扩展;
- ✅ 时间窗口需用 dt.floor('5T') 确保对齐(注意单位:'5T' = 5分钟,'5min' 等效);
- ✅ 始终确保 time 列为 datetime64 类型,否则 .dt 访问器不可用;
- ✅ 累计逻辑天然保留时序,适用于监控类、触发类分析场景。
掌握此模式后,你可轻松扩展至其他阈值(如200)、其他窗口(如10S、1H)或复合条件(如 price > 102 且 cum_volume > 100)。











