我有两个数据帧,它们的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
我该如何实现?
答案 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