我有 2 个由时间组成的数据框。我想找到当df2['Start Time'] - df1['Stop Time'] = dt
为
正时,所有df1时间和每个df2之间的最小时间。例如:
df1
停止时间站点 2023-10-17 20:10:00.310 P2 2023-10-17 21:20:00.440 P1 2023-10-17 23:30:00.200 P2 2023-10-18 00:00:00.190 P1 2023-10-18 01:00:00.130 P1 2023-10-18 02:00:00.500 P2 2023-10-18 03:00:00.480 P1 2023-10-18 04:00:00.020 P2 2023-10-18 05:00:00.000 P1 2023-10-18 06:00:00.580 P2
df2
开始时间站点 2023-10-17 16:00:00.190 SMR 2023-10-17 17:05:00.050 SMR 2023-10-17 19:10:00.550 SMR 2023-10-17 21:40:00.530 SMR 2023-10-17 22:21:00.180 SMR 2023-10-18 05:21:00.090 SMR 2023-10-18 09:15:00.360 SMR 2023-10-18 11:54:00.160 SMR
因此,对于此数据集,第一个正差异是
df2: 2023-10-17 21:40:00.530
和 df1: 2023-10-17 20:10:00.310 AND 2023-10-17 21:20:00.440
。我希望在新的 df_best
数据框中保留的最小值位于 2023-10-17 21:40:00.530 - 2023-10-17 21:20:00.440 = 20 min
与站点名称 P1 之间。所以第一个条目是:
df_最佳
diff_min 网站 5 P1
最后一个 d2 条目,2023-10-18 11:54:00.160,将与 d1 中的最后一个条目有一分钟......大约 5 小时 54 分钟。
我可以用几个 for 循环来做到这一点,但我敢打赌有一种很酷的 pandas 方法可以快速做到这一点。
谢谢,
您不需要找到所有匹配项,只需找到所需方向上最接近的匹配项即可。
merge_asof
:
df1['Stop Time'] = pd.to_datetime(df1['Stop Time'])
df2['Start Time'] = pd.to_datetime(df2['Start Time'])
out = (pd
.merge_asof(df2.sort_values(by='Start Time')
.reset_index(),
df1.sort_values(by='Stop Time'),
left_on='Start Time', right_on='Stop Time',
suffixes=(None, '_df1')
)
.set_index('index').reindex(df2.index)
.assign(diff_min=lambda d: d['Start Time'].sub(d['Stop Time'])
.dt.total_seconds().div(60))
)
print(out)
输出:
Start Time Site Stop Time Site_df1 diff_min
0 2023-10-17 16:00:00.190 SMR NaT NaN NaN
1 2023-10-17 17:05:00.050 SMR NaT NaN NaN
2 2023-10-17 19:10:00.550 SMR NaT NaN NaN
3 2023-10-17 21:40:00.530 SMR 2023-10-17 21:20:00.440 P1 20.001500
4 2023-10-17 22:21:00.180 SMR 2023-10-17 21:20:00.440 P1 60.995667
5 2023-10-18 05:21:00.090 SMR 2023-10-18 05:00:00.000 P1 21.001500
6 2023-10-18 09:15:00.360 SMR 2023-10-18 06:00:00.580 P2 194.996333
7 2023-10-18 11:54:00.160 SMR 2023-10-18 06:00:00.580 P2 353.993000