如何将小时级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
相关产品推荐
相关产品推荐

