如何按天循环遍历多标的分钟级OHLC数据?
问题:按标的+日期拆分分钟级K线数据并循环处理
我有一个包含不同标的分钟级K线(OHLC)数据的DataFrame,示例如下:
timestamp open high low close volume trade_count vwap symbol 0 2021-10-13 08:00:00+00:00 140.20 140.40 140.000 140.40 6084 65 140.205417 AAPL 1 2021-10-13 08:01:00+00:00 140.35 140.40 140.200 140.40 3052 58 140.308182 AAPL 2 2021-10-13 08:02:00+00:00 140.35 140.35 140.350 140.35 632 30 140.320934 AAPL 3 2021-10-13 08:03:00+00:00 140.28 140.30 140.200 140.20 2867 36 140.279473 AAPL 4 2021-10-13 08:04:00+00:00 140.20 140.20 140.200 140.20 435 36 140.199195 AAPL ... ... ... ... ... ... ... ... ... ... 58250 2021-10-27 19:58:00+00:00 209.31 209.33 209.215 209.26 26440 348 209.251852 ZTS 58251 2021-10-27 19:59:00+00:00 209.28 209.59 209.010 209.56 109758 1060 209.384672 ZTS 58252 2021-10-27 20:03:00+00:00 209.58 209.58 209.580 209.58 537786 49 209.580000 ZTS 58253 2021-10-27 20:05:00+00:00 209.58 209.58 209.580 209.58 4170 1 209.580000 ZTS 58254 2021-10-27 20:12:00+00:00 209.58 209.58 209.580 209.58 144 1 209.580000 ZTS [58255 rows x 9 columns]
我希望用df.groupby实现按每个标的的每一天拆分分钟数据,并能循环处理每个拆分后的子DataFrame,示例效果如下:
timestamp open high low close volume trade_count vwap symbol 0 2021-10-13 08:00:00+00:00 140.20 140.40 140.000 140.40 6084 65 140.205417 AAPL 1 2021-10-13 08:01:00+00:00 140.35 140.40 140.200 140.40 3052 58 140.308182 AAPL 2 2021-10-13 08:02:00+00:00 140.35 140.35 140.350 140.35 632 30 140.320934 AAPL 3 2021-10-13 08:03:00+00:00 140.28 140.30 140.200 140.20 2867 36 140.279473 AAPL 4 2021-10-13 08:04:00+00:00 140.20 140.20 140.200 140.20 435 36 140.199195 AAPL timestamp open high low close volume trade_count vwap symbol 0 2021-10-14 08:00:00+00:00 140.20 140.40 140.000 140.40 6084 65 140.205417 AAPL 1 2021-10-14 08:01:00+00:00 140.35 140.40 140.200 140.40 3052 58 140.308182 AAPL 2 2021-10-14 08:02:00+00:00 140.35 140.35 140.350 140.35 632 30 140.320934 AAPL 3 2021-10-14 08:03:00+00:00 140.28 140.30 140.200 140.20 2867 36 140.279473 AAPL 4 2021-10-14 08:04:00+00:00 140.20 140.20 140.200 140.20 435 36 140.199195 AAPL
之前尝试过这段代码:
table = df.groupby(pd.Grouper(key='timestamp', axis=0, freq='D')).sum()
但它会把分钟数据聚合为日线数据,不是我要的拆分效果:
Name: 2022-04-04 00:00:00+00:00, dtype: float64) (Timestamp('2022-04-05 00:00:00+0000', tz='UTC', freq='D'), open 0.0 high 0.0 low 0.0 close 0.0 volume 0.0 trade_count 0.0 vwap 0.0 Name: 2022-04-05 00:00:00+00:00, dtype: float64) (Timestamp('2022-04-06 00:00:00+0000', tz='UTC', freq='D'), open 2000.818300 high 2001.724000 low 2000.563300 close 2001.462900 volume 59717.000000 trade_count 487.000000 vwap 2001.073115 Name: 2022-04-06 00:00:00+00:00, dtype: float64)
解决方案
步骤1:确保timestamp列是datetime类型
如果你的timestamp还不是datetime格式,先转换:
df['timestamp'] = pd.to_datetime(df['timestamp'])
步骤2:按标的(symbol) + 日期分组
使用pd.Grouper按日期维度分组,同时结合symbol列,实现每个标的每天的拆分:
# 按symbol和日期分组,日期从timestamp中提取,频率为天(D) groups = df.groupby(['symbol', pd.Grouper(key='timestamp', freq='D')])
步骤3:循环遍历每个分组
遍历分组时,每个组会返回**分组键(symbol+日期)**和对应的子DataFrame:
for (symbol, date), daily_df in groups: print(f"Processing {symbol} on {date.date()}") # 这里可以对daily_df进行处理,比如计算指标、输出等 print(daily_df) print("-" * 50)
关键说明
- 这个方法不会聚合数据,而是直接拆分出每个标的每天的所有分钟级原始数据
- 分组键是一个元组,包含标的代码和日期(datetime类型),可以通过
date.date()转换为纯日期格式 - 如果不需要保留时区,也可以用
df['timestamp'].dt.date直接提取日期字符串来分组:groups = df.groupby(['symbol', df['timestamp'].dt.date])
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

