Pandas为1分钟K线DataFrame新增小时/市场开盘价填充列
Pandas计算小时开盘价、每日08:00开盘价填充列实现方案
前置要求
首先确认你的DataFrame满足基础条件:
- 必须保证时间索引
Date_Time为datetime64时间类型,否则所有时间维度的分组、筛选都会出错 - 数据为1分钟级别连续K线,从MetaTrader5导出格式无异常
实现步骤
1. 数据预处理
先按要求过滤掉每日08:00之前的条目,避免无效数据参与计算:
import pandas as pd # 若时间索引不是datetime类型,先执行转换 if not pd.api.types.is_datetime64_any_dtype(df.index): df.index = pd.to_datetime(df.index) # 保留每日08:00到收盘的所有数据 df = df.between_time("08:00", "23:59").copy()
2. 计算Hourly Open列
按自然小时分组,取每小时第一根1分钟K线的Open价格作为该小时的开盘价,同小时所有行填充该值,自动在新小时切换更新:
# 按小时维度分组,取每组第一个Open值赋值给同组所有行 df["Hourly Open"] = df.groupby(df.index.floor("H"))["Open"].transform("first") # 若存在分钟K线缺失的情况,补一层前向填充保证值连续 df["Hourly Open"] = df["Hourly Open"].ffill()
3. 计算Market Open列
提取每日08:00时刻第一根K线的Open价格作为当日市场开盘价,向下填充直到次日08:00更新新值:
# 仅保留每日08:00时刻的Open值,其余位置设为空值 df["Market Open"] = df["Open"].where(df.index.time == pd.to_datetime("08:00").time()) # 前向填充空值,实现跨分钟、跨小时沿用当日开盘价的效果 df["Market Open"] = df["Market Open"].ffill()
结果校验
执行以下代码可以快速验证计算结果是否符合预期:
# 校验每日08:00节点:三列值应该完全相等 print("每日08:00节点校验:") print(df[df.index.time == pd.to_datetime("08:00").time()][["Open", "Hourly Open", "Market Open"]]) # 校验每小时第一根K线节点:Open和Hourly Open值应该完全相等 print("\n每小时开盘节点校验:") print(df.groupby(df.index.floor("H")).first()[["Open", "Hourly Open"]])
异常处理提示:如果你的数据存在非交易日、全天数据缺失的情况,
ffill()会沿用上一个有效交易日的08:00开盘价,若需要规避该问题,可以在填充前增加交易日维度的分组判断,常规连续交易的MT5导出数据无需额外处理。
内容的提问来源于stack exchange,提问作者user2253810
相关产品推荐
相关产品推荐

