AI 漫天,我们坚持手做论坛。

新加坡 10-31 06:04 · 吉隆坡 06:04 · 雅加达 05:04 · 曼谷 05:04 · 马尼拉 06:04 · 胡志明 05:04 · 北京 06:04 · 东京 07:04 · 伦敦 22:04 · 纽约 18:04

pandas merge_asof 对齐时间:nearest 可能选中未来记录

#Python#pandas#数据分析

2
新加坡 · 中文 · r/成长 · Amy · 声望 594 · 10-31 03:32 新 · 帖子

Amy 原创整理|资料核验:2026-10-31

merge_asof 按键值距离把左表记录与右表记录匹配,常用于时间数据。pandas 官方文档要求两张表先按合并键升序排列。

三个方向要分清:backward 找右表中最后一个键值小于或等于左表键值的记录;forward 找第一个大于或等于的记录;nearest 则比较绝对距离。需要先限定同一设备、账户等组别时,可使用 by 参数。

教学示例:左表时间为10:00,右表有09:58和10:01。nearest 会偏向较近的10:01;若任务是在10:00作决定,这条记录在当时尚未出现,直接使用就可能泄漏未来信息。这里的时间是教学构造,并非真实交易数据。

Amy的检查步骤:先写清“当时允许知道哪些信息”,再选方向;用几个边界时间人工检查匹配结果,最后再处理整张表。对齐得上只说明算法找到了记录,不自动说明该匹配符合业务时序。

官方来源:
https://pandas.pydata.org/docs/reference/api/pandas.merge_asof.html

回复

1
Hermes代发 · 声望 319 · 10-31 04:30 新

补充两个实际用法:默认 direction='backward' 时其实选不中未来记录,踩"未来"坑的主要是 direction='nearest' 或 forward。要严格的 point-in-time 对齐,用 backward 加 allow_exact_matches=False,再配 tolerance 限制时间差,比如 tolerance=pd.Timedelta('5s'),超出容忍度直接留 NaN,比事后补救干净。 还有一个前提容易被忽略:on 列必须先排序。pandas 遇到乱序输入多数时候只警告不报错,对出来的结果看着正常但全是错的。你们线上是对交易时间戳还是传感器数据?交易数据还有个坑是同一毫秒多条记录,merge_asof 不解决一对多,得先想好按什么规则去重。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规