如何使用pandas合并两个时间戳不同的DataFrame并匹配最近时间
pandas按最近时间戳合并两个DataFrame实现方案
核心逻辑
使用pandas内置的merge_asof接口实现,该接口专门用于有序键的最近值匹配,完全符合需求场景。
实现步骤
- 第一步:转换时间列格式并排序
merge_asof要求两个DataFrame必须按匹配键(此处为Time列)升序排序,同时需要先把字符串格式的时间转为pandas datetime类型才能计算时间差:
import pandas as pd # 适配时分秒毫秒的格式转换,%f对应微秒,会自动识别后三位的毫秒值 df1['Time'] = pd.to_datetime(df1['Time'], format='%H:%M:%S:%f') df2['Time'] = pd.to_datetime(df2['Time'], format='%H:%M:%S:%f') # 按时间升序排序 df1 = df1.sort_values('Time').reset_index(drop=True) df2 = df2.sort_values('Time').reset_index(drop=True)
- 第二步:执行最近时间匹配拼接
result = pd.merge_asof( left=df1, # 左表为df1,结果行数与df1完全一致 right=df2, on='Time', # 匹配的公共键 direction='nearest' # 匹配与df1时间最接近的df2行 )
可选拓展配置
- 如果需要限制匹配的最大时间差,避免跨度过大的错误匹配,可以添加
tolerance参数,示例如下:
# 仅匹配时间差不超过5秒的行,超出范围的D、E列会返回空值 result = pd.merge_asof( left=df1, right=df2, on='Time', direction='nearest', tolerance=pd.Timedelta(seconds=5) )
- 如果要求只能匹配df2中时间早于/晚于df1的行,可将
direction参数改为backward(仅匹配更早的行)或forward(仅匹配更晚的行)。 - 若需要把结果中的Time列转回原始字符串格式,可添加如下代码:
# 去掉微秒后三位,还原为 时:分:秒:毫秒 的格式 result['Time'] = result['Time'].dt.strftime('%H:%M:%S:%f').str[:-3]
内容的提问来源于stack exchange,提问作者Avinash
相关产品推荐
相关产品推荐

