Python Pandas如何按索引合并时间戳不同的两个Dataframe
解决方案
你遇到的是时间戳不完全对齐的时间序列DataFrame合并问题,可根据实际需求选择以下3种方案:
方案1:按最近时间戳匹配合并(优先推荐)
使用pandas内置的merge_asof方法,可以直接为其中一个DataFrame的时间戳匹配另一个DataFrame中最近的时间对应数据,不会生成多余的时间行,也不会默认产生NaN。
import pandas as pd # 第一步:统一将两个DataFrame的索引转换为datetime格式 df.index = pd.to_datetime(df.index) df_temp.index = pd.to_datetime(df_temp.index) # 第二步:按最近时间戳合并,以下为以df的时间戳为基准的示例 df_merged = pd.merge_asof( df.sort_index(), # merge_asof要求输入必须按时间索引升序排列 df_temp.sort_index(), left_index = True, right_index = True, direction = 'nearest' # 匹配规则:nearest=最近、backward=前一个最近、forward=后一个最近 )
适用场景:需要保留其中一个DataFrame的原始时间戳,不需要修改时间粒度。
方案2:统一时间粒度后合并
先将两个DataFrame重采样到相同的时间频率,再直接合并即可完全对齐索引。
# 第一步:统一转换索引为datetime格式 df.index = pd.to_datetime(df.index) df_temp.index = pd.to_datetime(df_temp.index) # 第二步:重采样到相同时间粒度,示例为1分钟,可按需替换为1S(1秒)、5T(5分钟)等 # 聚合函数可按需替换为sum、first、last等 df_resample = df.resample('1T').mean() df_temp_resample = df_temp.resample('1T').mean() # 第三步:直接合并对齐后的DataFrame df_merged = df_resample.join(df_temp_resample, how='outer')
适用场景:需要统一两个数据的时间粒度,后续做统计分析、时序建模。
方案3:保留所有原始时间戳+缺失值填充
如果要保留两个DataFrame的所有原始时间戳,可以在你之前concat的基础上补充缺失值填充逻辑:
# 先执行你之前的合并排序逻辑 df_merged = pd.concat([df, df_temp]).sort_index() # 按相邻的最近值填充NaN,limit参数可控制最多填充的间隔数,避免填充时间差过大的错误数据 df_merged = df_merged.ffill(limit=3).bfill(limit=3)
适用场景:需要保留两个数据源的全部原始时间戳记录。
内容的提问来源于stack exchange,提问作者Vaibhav Ghildiyal
相关产品推荐
相关产品推荐

