python-3.x - 让 pandas merge_asof 只在同一个数据中找到最接近的值
问题描述
我想合并两个时间序列数据框。第一个 df 中的值应合并到具有最接近(但不完全匹配)日期时间戳的第二个 df 的值中。但是第二个 df 的日期时间戳只能在 IFF 中合并,它是同一日期。
Pandas merge_asof 提供了所需的功能,除了它将合并任何先前日期的值(如果该日期是“最近的”)。下面的示例显示了当前行为和所需行为。
围绕当前行为的任何方法?
import pandas as pd
from datetime import datetime
c = pd.DataFrame([["2017-01-25 00:30:17", "LQE7GNC8O"],
["2017-01-25 00:30:18", "IWK8UOOU1"],
["2017-01-25 00:30:46", "MULAPBFTI"],
["2017-01-25 01:00:08", "RO9N7X31Z"],
["2017-01-25 01:00:08", "SDSFKA3LK"],
["2017-01-25 01:00:42", "YRVASRCNT"],
["2017-01-25 01:00:43", "D5KVPH3H6"],
["2017-01-25 01:00:48", "QZ98EIW2O"],
["2017-01-25 01:01:49", "LBC4F46JG"],
["2017-01-25 02:01:49", "PKGUHA9SS"],
["2017-01-25 03:15:24", "8YD2DFLMZ"]], columns=["datetime", "key"])
d = pd.DataFrame([["2017-01-24 00:00:00", "111111111"],
["2017-01-24 23:00:22", "111111111"],
["2017-01-25 01:00:22", "J64SHBLXH"],
["2017-01-25 01:00:27", "XCKJCJWSR"],
["2017-01-25 01:15:42", "3XSN8RWEY"],
["2017-01-25 02:14:42", "UIQKQL9EH"]], columns=["datetime", "words"])
c["datetime"] = pd.to_datetime(c["datetime"])
d["datetime"] = pd.to_datetime(d["datetime"])
pd.merge_asof(c, d.sort_values("datetime"), on="datetime", allow_exact_matches=False)
YIELDS:
datetime key words
0 2017-01-25 00:30:17 LQE7GNC8O 111111111
1 2017-01-25 00:30:18 IWK8UOOU1 111111111
2 2017-01-25 00:30:46 MULAPBFTI 111111111
3 2017-01-25 01:00:08 RO9N7X31Z 111111111
4 2017-01-25 01:00:08 SDSFKA3LK 111111111
5 2017-01-25 01:00:42 YRVASRCNT XCKJCJWSR
6 2017-01-25 01:00:43 D5KVPH3H6 XCKJCJWSR
7 2017-01-25 01:00:48 QZ98EIW2O XCKJCJWSR
8 2017-01-25 01:01:49 LBC4F46JG XCKJCJWSR
9 2017-01-25 02:01:49 PKGUHA9SS 3XSN8RWEY
10 2017-01-25 03:15:24 8YD2DFLMZ UIQKQL9EH
DESIRED:
datetime key words
0 2017-01-25 00:30:17 LQE7GNC8O NaN
1 2017-01-25 00:30:18 IWK8UOOU1 NaN
2 2017-01-25 00:30:46 MULAPBFTI NaN
3 2017-01-25 01:00:08 RO9N7X31Z NaN
4 2017-01-25 01:00:08 SDSFKA3LK NaN
5 2017-01-25 01:00:42 YRVASRCNT XCKJCJWSR
6 2017-01-25 01:00:43 D5KVPH3H6 XCKJCJWSR
7 2017-01-25 01:00:48 QZ98EIW2O XCKJCJWSR
8 2017-01-25 01:01:49 LBC4F46JG XCKJCJWSR
9 2017-01-25 02:01:49 PKGUHA9SS 3XSN8RWEY
10 2017-01-25 03:15:24 8YD2DFLMZ UIQKQL9EH
解决方案
在这里你去传递date
到by
pd.merge_asof(c.assign(date=c.datetime.dt.date), d.sort_values("datetime").assign(date=d.datetime.dt.date), on="datetime", allow_exact_matches=False , by = 'date')
Out[215]:
datetime key date words
0 2017-01-25 00:30:17 LQE7GNC8O 2017-01-25 NaN
1 2017-01-25 00:30:18 IWK8UOOU1 2017-01-25 NaN
2 2017-01-25 00:30:46 MULAPBFTI 2017-01-25 NaN
3 2017-01-25 01:00:08 RO9N7X31Z 2017-01-25 NaN
4 2017-01-25 01:00:08 SDSFKA3LK 2017-01-25 NaN
5 2017-01-25 01:00:42 YRVASRCNT 2017-01-25 XCKJCJWSR
6 2017-01-25 01:00:43 D5KVPH3H6 2017-01-25 XCKJCJWSR
7 2017-01-25 01:00:48 QZ98EIW2O 2017-01-25 XCKJCJWSR
8 2017-01-25 01:01:49 LBC4F46JG 2017-01-25 XCKJCJWSR
9 2017-01-25 02:01:49 PKGUHA9SS 2017-01-25 3XSN8RWEY
10 2017-01-25 03:15:24 8YD2DFLMZ 2017-01-25 UIQKQL9EH
推荐阅读
- node.js - 无法使用纱线 ENOENT 自述文件
- android - 如何在 Android TV 上使用 NotificationContentProvider 获取通知计数?
- javascript - html2canvas + jsPDF 截断图片
- spring-boot - 在 AWS 上嵌入 tomcat 的 Spring Boot 开始失败
- javascript - 使用 Python 和 Flask 填充依赖下拉列表
- elasticsearch - 如何在 spring-data 中关闭 ElasticSearch RestHighLevelClient 以避免声纳阻塞问题 应关闭资源
- c# - 在客户端机器上部署 Winforms 应用程序
- javascript - 当您单击身体或在手机上移动手指时停止滚动
- php - 当 php/laravel 中的数据量很大时,如何在进度条上赋值?
- java - 用逗号格式化 BigDecimal 数字,最多保留 2 位小数