You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按天循环遍历多标的分钟级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:01:04