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

如何用Pandas无需上采样1min数据合并多时间帧OHLCV数据帧

Pandas多时间维度OHLCV合并实现方案

前提说明

现有1min、5min、15min、60min、日线共5个时间维度的OHLCV数据集,以1min数据为合并基准,不修改原始1min数据行结构,全程无未来数据偏差。

核心匹配规则

  • 禁止对1min数据做上采样,仅通过datetime字段关联匹配各维度数据,不丢失历史日线信息
  • 5min、15min、60min维度:当1min行时间≥对应维度数据的时间戳时,向前匹配最近一条对应维度的OHLCV值,禁止向后填充避免未来偏差
  • 日线维度(适配Alpha Vantage数据结构):1min行时间<当日16:00时匹配前一日日线OHLCV,≥16:00时匹配当日日线OHLCV
  • 进阶计算需求:无需依赖外部5/15/60min数据集,直接从1min数据滚动生成对应周期指标:Open取周期首个1min开盘价、High取周期内最高价、Low取周期内最低价、Close取周期最新价、Volume取周期累计成交量

高效实现代码

前置预处理

所有数据集需提前完成时间类型转换与排序,保证匹配逻辑正确:

import pandas as pd

# 预处理通用函数:转换datetime列+按时间升序排序
def preprocess_df(df, time_col='datetime'):
    df[time_col] = pd.to_datetime(df[time_col])
    df = df.sort_values(time_col).reset_index(drop=True)
    return df

# 假设各维度原始数据已加载完成
df_1min = preprocess_df(df_1min)
df_5min = preprocess_df(df_5min)
df_15min = preprocess_df(df_15min)
df_60min = preprocess_df(df_60min)
df_daily = preprocess_df(df_daily)

方案1:基于已有各维度数据集匹配(基础需求)

用Pandas原生pd.merge_asof实现高效向前匹配,性能远优于循环/逐行判断逻辑:

# 批量匹配5/15/60min维度数据,自动添加后缀区分同名字段
for freq, df_freq in zip(['5min', '15min', '60min'], [df_5min, df_15min, df_60min]):
    df_1min = pd.merge_asof(
        left=df_1min,
        right=df_freq.add_suffix(f'_{freq}'),
        left_on='datetime',
        right_on=f'datetime_{freq}',
        direction='backward' # 核心参数:仅向前匹配,完全避免未来数据泄露
    )

# 匹配日线维度数据
## 生成1min数据的日线匹配key
df_1min['daily_match_date'] = df_1min['datetime'].apply(
    lambda x: x.date() if x.hour >=16 else (x - pd.Timedelta(days=1)).date()
)
## 日线数据生成匹配key
df_daily['trade_date'] = df_daily['datetime'].dt.date
df_daily = df_daily.add_suffix('_daily').rename(columns={'trade_date_daily': 'trade_date'})
## 关联日线数据后清理冗余字段
df_1min = df_1min.merge(
    df_daily,
    left_on='daily_match_date',
    right_on='trade_date',
    how='left'
).drop(columns=['daily_match_date', 'trade_date', 'datetime_daily'])

方案2:从1min数据滚动生成各周期指标(进阶需求)

无需依赖外部周期数据集,直接在1min数据上分组计算对应维度指标:

# 定义周期与对应聚合规则
freq_agg = {
    '5T': {
        'open': 'first',
        'high': 'max',
        'low': 'min',
        'close': 'last',
        'volume': 'sum'
    },
    '15T': {
        'open': 'first',
        'high': 'max',
        'low': 'min',
        'close': 'last',
        'volume': 'sum'
    },
    '60T': {
        'open': 'first',
        'high': 'max',
        'low': 'min',
        'close': 'last',
        'volume': 'sum'
    }
}

# 滚动计算各周期指标后合并回1min数据
for freq, agg_rule in freq_agg.items():
    # 按周期分组聚合得到对应维度OHLCV
    df_freq = df_1min.groupby(pd.Grouper(key='datetime', freq=freq)).agg(agg_rule).reset_index()
    # 重命名列区分不同维度
    df_freq.columns = [f'{col}_{freq.replace("T", "min")}' if col != 'datetime' else col for col in df_freq.columns]
    # 向前匹配回1min基准数据
    df_1min = pd.merge_asof(
        left=df_1min,
        right=df_freq,
        on='datetime',
        direction='backward'
    )

# 日线维度计算和方案1逻辑一致,可直接复用

注意事项

  • 所有时间列必须是带时区的统一格式,避免跨时区匹配错误
  • 若存在非交易日数据,可替换日线匹配逻辑中的pd.Timedelta(days=1)为pd.offsets.BDay(1)自动跳过节假日

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:06:01