如何用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
相关产品推荐
相关产品推荐

