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

如何高性能实现Pandas两个DataFrame带时间容差的合并

兼容秒级时间误差的高性能匹配方案

核心思路

使用pandas内置的merge_asof方法实现范围匹配,该方法针对有序键(如时间)做了底层优化,无需自定义模糊匹配逻辑,可轻松支持百万级数据集的秒级匹配。

实现步骤

  • 前置处理:转换日期格式并拆分数据
    先将date列转换为datetime类型,拆分出WH、OR两类数据后按时间列排序(merge_asof要求右表的匹配键为有序序列,左表提前排序也可提升匹配性能)
    import pandas as pd
    
    # 转换date列为标准datetime格式
    test_df['date'] = pd.to_datetime(test_df['date'])
    # 拆分两类数据,修正原代码中clazz取值的笔误(原代码误写为OH,实际应为OR)
    wh = test_df[test_df['clazz'] == 'WH'].sort_values('date').reset_index(drop=True)
    or_df = test_df[test_df['clazz'] == 'OR'].sort_values('date').reset_index(drop=True)
    
  • 带时间容差的合并
    调用merge_asof设置1秒的时间误差容忍度,通过by参数限定仅cat1、cat2相同的行参与匹配:
    result = pd.merge_asof(
        left=wh,
        right=or_df,
        on='date',
        by=['cat1', 'cat2'],
        tolerance=pd.Timedelta(seconds=1),
        # 匹配方向可按需调整:nearest=最近时间、backward=仅OR时间早于等于WH、forward=仅OR时间晚于等于WH
        direction='nearest',
        suffixes=('_wh', '_or')
    )
    

方案说明

  • 性能表现:原difflib方案的时间复杂度为O(n*m),4000条数据就需要1600万次字符串比对,300万级数据完全不可行;merge_asof基于排序后的二分查找实现,时间复杂度为O(n log m),300万条数据匹配通常可在10秒内完成。
  • 场景适配:如果业务需要匹配所有符合时间差的条目而非仅最近的一条,可使用等值merge加时间差过滤的方案,适合每个cat1+cat2分组下数据量较小的场景:
    # 全量匹配所有符合时间差要求的条目对
    temp = wh.merge(or_df, on=['cat1', 'cat2'], suffixes=('_wh', '_or'))
    result = temp[abs(temp['date_wh'] - temp['date_or']) <= pd.Timedelta(seconds=1)]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:04