我之前询问了 question,关于在最近的日期时间和通过 ID 合并数据帧,并建议使用 merge_asof,但我在列中得到 NaN 值。 df 示例如下:
df1
ID1 active_at
0 111 2020-01-01 00:50:00.000
1 222 2020-01-05 05:00:00.000
2 333 2020-01-10 10:00:00.000
df2
ID2 timeObserved Value
0 111 2020-01-01 00:55:00 1
1 111 2020-01-05 01:00:00 2
2 222 2020-01-10 05:50:00 3
3 222 2020-01-15 04:55:00 4
4 333 2020-01-20 10:10:00 5
5 333 2020-01-20 11:00:00 6
我想得到类似于:
df3
ID1 active_at Value
0 111 2020-01-01 00:50:00.000 1
1 222 2020-01-05 05:00:00.000 4
2 333 2020-01-10 10:00:00.000 5
或
df3
ID1 active_at Value ID2 timeObserved
0 111 2020-01-01 00:50:00.000 1 111 2020-01-01 00:55:00
1 222 2020-01-05 05:00:00.000 4 222 2020-01-15 04:55:00
2 333 2020-01-10 10:00:00.000 5 333 2020-01-20 10:10:00
我用它来合并它们:
df3 = pd.merge_asof(df1,df2, left_on='active_at', right_on='timeObserved', left_by='ID1',
right_by='ID2', direction='nearest')
但我得到了这个结果:
df1
ID1 active_at Value ID2 timeObserved
0 111 2020-01-01 00:50:00.000 NaN NaN NaT
1 222 2020-01-05 05:00:00.000 NaN Nan Nat
2 333 2020-01-10 10:00:00.000 5 333 2020-01-20 10:10:00
在真实数据中,我正确地得到了 50 个中的 2 个。 我确定有匹配的 ID,这就是我想知道的原因。
我试过: 将 tolerance=pd.Timedelta('2d') 设置为多天。 在合并之前仔细检查 dType 是否正确。 dateTime64[ns] 在 'active_at' 和 'timeObserved' 上,在 'value' 和 'ID' 上是 int。 确保有匹配的 ID。
当我使用 df3.info() 时,我注意到“Value”和“ID2”的 dType 已更改为 float64。我不知道为什么,是因为 NaN 值还是我犯了一些错误?
df1 中有 2.732 行,df2 中有 40.500 行。