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

基于时间范围匹配Pandas DataFrame并高效填充字段值的方法

时间区间匹配填充高效实现方案

性能说明

循环逐行匹配的时间复杂度为O(M*N),面对百万级df1、数千级df2的场景性能完全不达标,以下方案基于pandas原生向量化运算实现,时间复杂度为O(M log M + N log N),秒级即可完成运算。

完整代码

import numpy as np
import pandas as pd

# 输入数据构造(你原有代码)
df1 = pd.DataFrame({'value1': np.random.random(14)})
df1['Time'] = pd.date_range('2022-1-1', periods=14, freq='1s')
df2 = pd.DataFrame({'start':['2022-01-01 00:00:03', '2022-01-01 00:00:08'], 'end':['2022-01-01 00:00:05', '2022-01-01 00:00:12'], 'Value2': [2, 5]})
df2.start, df2.end = pd.to_datetime(df2.start), pd.to_datetime(df2.end)

# 核心处理逻辑
# 1. 时序匹配要求时间列有序,先对两个表做排序
df1_sorted = df1.sort_values('Time').reset_index(drop=True)
df2_sorted = df2.sort_values('start').reset_index(drop=True)

# 2. 用merge_asof匹配每个Time对应的最近起始时间
merged = pd.merge_asof(
    left=df1_sorted,
    right=df2_sorted,
    left_on='Time',
    right_on='start',
    direction='backward'
)

# 3. 过滤掉超出结束时间的无效匹配,得到最终Value2
merged['Value2'] = merged['Value2'].where(merged['Time'] <= merged['end'], pd.NA)

# 4. 结果回写到原df1
df1 = df1.merge(merged[['Time', 'Value2']], on='Time', how='left')

输出效果说明

最终df1的Value2列会自动匹配填充:

  • Time在2022-01-01 00:00:03到2022-01-01 00:00:05之间的行,Value2为2
  • Time在2022-01-01 00:00:08到2022-01-01 00:00:12之间的行,Value2为5
  • 其余时间的行Value2为缺失值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:11