基于时间范围匹配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
相关产品推荐
相关产品推荐

