You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用merge_asof实现两个DataFrame按name精确匹配、time区间匹配合并

你调用pd.merge_asof失败是因为参数使用错误:on参数仅支持传入单个用于容差匹配的有序列(数值/时间类型),需要完全匹配的name字段需要通过by参数传入,不能放在on列表中。

正确实现步骤

  • 首先必须保证两个DataFrame都按【完全匹配字段 + 容差匹配字段】升序排序,这是merge_asof的强制要求
  • 调用方法时分别指定by和on参数即可

代码示例

import pandas as pd
import numpy as np

# 构造示例数据
a = pd.DataFrame(np.reshape(range(25), (5,5)))
b = pd.DataFrame(np.reshape(range(25), (5,5)))
a['name'] = ['a', 'b', 'c', 'c','d']
b['name'] = ['a', 'b', 'b', 'c','d']

# 假设列4为要做容差匹配的时间列,先转为datetime类型
a[4] = pd.to_datetime(a[4], unit='ms')
b[4] = pd.to_datetime(b[4], unit='ms')

# 对两个表按规则排序
a = a.sort_values(['name', 4]).reset_index(drop=True)
b = b.sort_values(['name', 4]).reset_index(drop=True)

# 执行合并
merge_result = pd.merge_asof(
    left=a,
    right=b,
    by='name', # 指定完全匹配的字段
    on=4, # 指定容差匹配的时间字段
    tolerance=pd.Timedelta('200ms'),
    direction='nearest',
    suffixes=['', '_x']
)

如果你的容差匹配字段是数值类型,直接把tolerance设置为对应的数值即可,比如允许数值差2就设置tolerance=2。

内容的提问来源于stack exchange,提问作者nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:06:02