在最匹配的日期时间索引上合并两个数据框

时间:2020-08-12 23:01:39

标签: python pandas dataframe merge left-join

我有两个数据帧,它们的DateTime索引最匹配,有时匹配。目的是将两个索引合并为一个索引,然后将第二个附加到最接近的匹配项(在1分钟以内)。

我的代码和输出:

import pandas as pd

masterdf = pd.DataFrame({"AA":[77.368607,77.491655,77.425134,76.490991]})
masterdf.index = ['2019-10-01 07:52:07','2019-10-01 07:53:01','2019-10-01 07:53:54','2019-10-01 07:54:47']
masterdf.index.name = 'datetime'

slavedf = pd.DataFrame({"BB":[50,60,70,80]})
slavedf.index = ['2019-10-01 07:53:00','2019-10-01 07:53:54','2019-10-01 10:54:47','2019-10-01 10:00:00']
slavedf.index.name = 'datetime'

maindf = masterdf.merge(slavedf,left_index=True,right_index=True)

当前输出:

masterdf = 
                            AA
datetime                      
2019-10-01 07:52:07  77.368607
2019-10-01 07:53:01  77.491655
2019-10-01 07:53:54  77.425134
2019-10-01 07:54:47  76.490991

slavedf = 
                     BB
datetime               
2019-10-01 07:53:00  50
2019-10-01 07:53:54  60
2019-10-01 10:54:47  70
2019-10-01 10:00:00  80

maindf = 
datetime                   AA         BB
2019-10-01 07:53:54    77.425134      60

预期输出:

maindf = 
datetime                   AA          BB
2019-10-01 07:53:01    77.491655       50
2019-10-01 07:53:54    77.425134       60

我该如何实现?

2 个答案:

答案 0 :(得分:1)

您需要澄清一些有关“最匹配的DateTime索引”的信息

这两种方式都匹配吗? 那已经使用的元素呢? 索引之间的差异是否有任何限制?

如果您澄清这些,就可以解决任务

答案 1 :(得分:1)

这里的逻辑使用merge_asof,由于merge_asof将使用第二个数据帧多次,因此我们需要对其进行调整,然后我们需要附加的键,在这里是datetime来删除重复项

masterdf.index=pd.to_datetime(masterdf.index)
masterdf=masterdf.sort_index().reset_index()
slavedf.index=pd.to_datetime(slavedf.index)
slavedf=slavedf.sort_index().reset_index()
slavedf['datetime2']=slavedf['datetime']
slavedf['key']=slavedf.index
newdf=pd.merge_asof(masterdf,slavedf,on='datetime',tolerance=pd.Timedelta('60s'),direction='nearest')
newdf['diff']=(newdf.datetime-newdf.datetime2).abs()
newdf=newdf.sort_values('diff').drop_duplicates('key')
newdf
Out[35]: 
             datetime         AA  BB           datetime2     diff
2 2019-10-01 07:53:54  77.425134  60 2019-10-01 07:53:54 00:00:00
1 2019-10-01 07:53:01  77.491655  50 2019-10-01 07:53:00 00:00:01