如何合并含Dates列的Pandas DataFrame并保留全量数据?
解决1分钟数据与5分钟指标的匹配填充问题
核心思路
通过时间向下取整对齐5分钟区间,再用左连接+前向填充实现指标值的批量匹配,既保留所有1分钟数据,又完成指标的对应填充。
具体步骤与代码示例
假设你有两个DataFrame:
df_1min:1分钟级股票数据,含Dates(时间戳)、Open/High/Low/Close等行情列df_5min:5分钟级指标数据,含Dates(时间戳)、Indicator(计算出的指标列)
统一时间区间键
先确保时间列是datetime类型,再将两个DataFrame的时间戳向下取整到最近的5分钟起始点,生成用于匹配的区间键:# 转换时间列为datetime类型(若未转换) df_1min['Dates'] = pd.to_datetime(df_1min['Dates']) df_5min['Dates'] = pd.to_datetime(df_5min['Dates']) # 生成5分钟区间起始点列 df_1min['5min_window'] = df_1min['Dates'].dt.floor('5min') df_5min['5min_window'] = df_5min['Dates'].dt.floor('5min')dt.floor('5min')会把任意时间戳对齐到所属5分钟区间的开头,比如10:02:00会变成10:00:00,10:05:00会变成10:05:00,确保同属一个5分钟区间的1分钟数据和对应指标拥有相同的匹配键。左连接合并数据
以1分钟数据为基础做左连接,保留所有1分钟记录,同时匹配对应区间的指标:df_merged = pd.merge( df_1min, df_5min[['5min_window', 'Indicator']], # 仅保留匹配键和指标列 on='5min_window', how='left' )这一步后,每个5分钟区间的第一条1分钟数据会有指标值,后续4条数据的
Indicator列会是缺失值(NaN)。填充缺失的指标值
用前向填充(ffill())把同一个5分钟区间的指标值填充到所有对应1分钟记录:df_merged['Indicator'] = df_merged['Indicator'].ffill()这样每个5分钟区间内的5条1分钟数据都会拥有相同的指标值,且1分钟数据的连续性完全保留。
清理临时列(可选)
如果不需要5min_window这个临时匹配键,可以删除:df_merged = df_merged.drop('5min_window', axis=1)
关键说明
- 若你的5分钟指标时间本身就是区间起始点(比如正好是
10:00:00、10:05:00),可以跳过对df_5min的dt.floor处理,直接用原Dates列作为匹配键。 - 确保
df_5min的时间区间覆盖df_1min的全部时间范围,若有1分钟数据无对应指标,ffill()会用最后一个有效的指标值填充;若不需要这种行为,可以根据需求调整填充逻辑(比如用bfill()或固定值填充)。
内容的提问来源于stack exchange,提问作者bugrahaskan
相关产品推荐
相关产品推荐

