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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:24:30