Polars中对比两表并基于时间比较结果匹配对应时段值的方法
Polars 时段匹配最优实现
你当前使用的字典压缩+lambda取最小值的方案属于Python层逐行运算,无法利用Polars的向量化执行优势,数据量较大时性能损耗明显。针对这种「按最近时间点匹配维度属性」的场景,Polars原生提供join_asof(异步近似连接)方法,不需要写自定义遍历逻辑,执行效率和规范性都更好。
实现代码
# 注意:join_asof要求右表(参考表)必须按连接用的时间列排序 result = df_a.join_asof( df_b.sort("Time"), left_on="arrival_time", right_on="Time", strategy="backward" )
参数说明
strategy="backward"完全匹配你的时段划分规则:为每个到达时间匹配参考表中时间不晚于当前到达时间的最近一条记录:- 08:40:10的到达时间,匹配到最近的前置时间点08:00:00,对应时段
Early - 19:31:26的到达时间,匹配到最近的前置时间点16:00:00,对应时段
Afternoon
- 08:40:10的到达时间,匹配到最近的前置时间点08:00:00,对应时段
- 输出结果和你给出的预期完全一致。
扩展提示
如果你的参考表是按天维护时段(即每天都有08:00、16:00这类时段节点),只需要给两个表都增加日期列,在join_asof中增加by="日期列名"参数,就可以自动按天匹配,不会出现跨天匹配错误的问题,不需要额外写日期判断逻辑。
原方案缺陷
- 所有运算在Python层循环执行,无法调用Polars Rust内核的向量化优化,十万行以上数据性能差距可达百倍级
- 跨天、时区转换等场景下容易出现匹配逻辑错误,原生时间类型比较不存在这类问题
- 后续维护参考表(比如新增时段节点)需要重新生成字典,原生join逻辑只需要保证参考表排序即可,维护成本更低
内容的提问来源于stack exchange,提问作者luis.martinez.pro
相关产品推荐
相关产品推荐

