You need to enable JavaScript to run this app. 如何使用pandas合并两个时间戳不同的DataFrame并匹配最近时间
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 18:36:07