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

如何将小时级OHLC数据按每日21:00-次日05:00重组成单行?

解决小时级OHLC数据跨天时段(21:00-次日05:00)的聚合问题

我来帮你搞定这个跨天OHLC聚合的问题!你遇到的问题核心是跨天时段的分组逻辑没处理对——之前的筛选只是拿到了目标时段的小时数据,但没把它们按对应的交易日聚合成单行,而且跨天的日期归属很容易出错。下面用Python pandas(处理时间序列最常用的工具)一步步解决:

第一步:确保时间索引正确

首先得把你的时间列转换成标准的datetime格式,并设置为数据框的索引,这是后续所有时间操作的基础:

import pandas as pd

# 假设你的数据框叫df,时间列名为'timestamp'(换成你实际的列名)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')

# 注意:如果数据涉及时区,一定要统一时区,比如换成国内时区:
# df.index = df.index.tz_convert('Asia/Shanghai')

第二步:筛选目标时段的数据

先把每日21:00到次日05:00的小时数据筛选出来,这里直接用时间索引的小时属性判断:

# 筛选出【21:00及以后】或者【05:00以前】的数据
filtered_df = df[(df.index.hour >= 21) | (df.index.hour < 5)]

第三步:处理跨天的分组日期

这是最关键的一步!我们需要把当日21:00到次日05:00的所有数据,归到同一个“交易日”(比如2024-05-20 21:00到2024-05-21 05:00,全部归为2024-05-20的交易日):

# 先给每条数据标记初始分组日期(就是时间戳的当天日期)
filtered_df['group_date'] = filtered_df.index.date

# 把次日00:00-05:00的数据,分组日期改为前一天
filtered_df.loc[filtered_df.index.hour < 5, 'group_date'] = filtered_df.loc[filtered_df.index.hour < 5, 'group_date'] - pd.Timedelta(days=1)

第四步:按交易日聚合OHLC

现在把同一个分组日期下的小时数据聚合成单行OHLC,聚合逻辑要符合行情数据的规则:

  • Open:该时段第一个小时的开盘价
  • High:该时段所有小时的最高价
  • Low:该时段所有小时的最低价
  • Close:该时段最后一个小时的收盘价
  • Volume:该时段所有小时的成交量之和(如果有成交量列的话)

代码如下:

# 按group_date分组聚合,记得替换成你实际的OHLC列名
daily_ohlc = filtered_df.groupby('group_date').agg({
    'Open': 'first',
    'High': 'max',
    'Low': 'min',
    'Close': 'last',
    'Volume': 'sum'  # 没有成交量列的话可以删掉这一行
})

# 可选:把分组日期转回datetime类型的索引,方便后续分析
daily_ohlc.index = pd.to_datetime(daily_ohlc.index)

排查你之前遇到的问题

  • 筛选后得到多行:因为你只做了筛选,没做聚合步骤,上面的groupby.agg就是把多行小时数据合并成单行日数据的关键。
  • 得到16:00-00:00的数据:大概率是时区不匹配!比如你的数据是UTC时间,但你按本地时区(比如东八区)筛选,就会出现时段偏移。一定要确保时间索引的时区和你预期的一致。
  • 结果仅含NaN值:要么是分组后某些日期没有符合条件的数据,要么是聚合时的列名和你的数据列名不匹配,检查一下列名拼写是否正确。

内容的提问来源于stack exchange,提问作者Milos Jovanovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:28:01