本文介绍如何使用 pd.merge_asof() 高效完成两个 dataframe 的“按分组 + 时间区间内匹配”操作,避免低效嵌套循环,在数十万行数据下将耗时从 10 分钟降至毫秒级。
在数据分析中,常需将事件时间(如设备触发时刻)映射到其所属的时间窗口(如产线作业班次、设备维护周期),并携带对应属性(如工单编号、状态值、测量值等)。本例中,df1 包含按 LOT 分组的事件记录(含 EVENT_TIME),df2 提供每个 LOT 下多个时间窗口(IN_TIME → OUT_TIME)及其关联值 VALUE;目标是为 df1 每一行匹配同一 LOT 下且满足 IN_TIME ≤ EVENT_TIME ≤ OUT_TIME 的 VALUE,生成新列 DATA。
直接使用双重 for 循环(如原问题所示)时间复杂度为 O(n×m),面对 10 万+ 行数据极易超时。Pandas 提供了专为此类场景优化的 merge_asof() —— 它基于排序合并(sort-merge join),支持按键分组、左表时间列与右表时间列的最近向下匹配(nearest backward join),再辅以条件过滤,即可精准实现“区间内匹配”。
✅ 正确步骤与代码实现
首先确保所有时间列已转为 datetime64 类型(merge_asof 强制要求):