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

Python 在最匹配的日期时间索引上合并两个数据帧,python,pandas,dataframe,merge,left-join,Python,Pandas,Dataframe,Merge,Left Join,我有两个数据帧,最接近匹配的日期时间索引,有时匹配。目标是使用一个索引作为引用合并其中两个索引,并将第二个索引附加到第一个索引上最接近的匹配项(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:

我有两个数据帧,最接近匹配的日期时间索引,有时匹配。目标是使用一个索引作为引用合并其中两个索引,并将第二个索引附加到第一个索引上最接近的匹配项(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

如何实现这一点?

您需要澄清有关“最接近匹配的日期时间索引”的一些问题

是双向匹配吗? 那么已经使用的元素呢? 索引之间的差异有任何限制吗


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

你需要澄清一些关于“最接近匹配的日期时间索引”的事情

是双向匹配吗? 那么已经使用的元素呢? 索引之间的差异有任何限制吗


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

逻辑这里使用
合并asof
,我们需要调整它,因为,
合并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

这里的逻辑使用
merge\u asof
,我们需要调整它,因为,
merge\u 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


@BEN_YO你能帮我做这个吗。谢谢,请提供一个。@AMC我已经修改了它。我相信你应该能够在你的领域复制同样的东西。@BEN_-YO你能帮我吗。谢谢,请提供一个。@AMC我已经修改了它。我相信你应该能够在你那边重现同样的情况。我已经更新了我的问题。大约1分钟最接近的比赛就可以了。我不理解你剩下的问题。所谓“双向”,我的意思是如果Ax可以比他的匹配项Bx大或小,那么剩余的问题意味着,例如,如果元素Bx用于另一个匹配项,它是否可以再次使用?是的!在上述问题中,
slavedf
的行数多于
masterdf
。我已更新了我的问题。大约1分钟最接近的比赛就可以了。我不理解你剩下的问题。所谓“双向”,我的意思是如果Ax可以比他的匹配项Bx大或小,那么剩余的问题意味着,例如,如果元素Bx用于另一个匹配项,它是否可以再次使用?是的!在上述问题中,
slavedf
的行数比
masterdf
的行数多。杰出的你刚刚搞定了。非常感谢。为了得到这个,我已经绞尽脑汁好几个小时了。你说得对。我只是有几个问题。我的实际数据帧有20000行。我非常感谢您创建的
newdf['diff']
,以查看合并行之间的时间差。我看到最小值为0,最大值为7秒。我的问题是:
drop_duplicates('key')
drop什么样的行?@B分配给A中的diff行,您只想保持最低时间diff~您的意思是,B中的一行值有可能分配给A中的两行或更多行?那么时差被调低了?我说得对吗?@大陆因为我把公差设置为1分钟,如果你把它设置得很低,我们可以减少将相同的B行分配给多个A行的变化。我只是想让你想到的是保持最小的时差。没别的了。甚至我都担心哪一行会被分配什么样的值?我无法手动检查每一个。你的新专栏和分类确实帮助我理解了我们谈论的时差。我真的很惊讶。谢谢你,汤顿。杰出的你刚刚搞定了。非常感谢。为了得到这个,我已经绞尽脑汁好几个小时了。你说得对。我只是有几个问题。我的实际数据帧有20000行。我非常感谢您创建的
newdf['diff']
,以查看合并行之间的时间差。我看到最小值为0,最大值为7秒。我的问题是:
drop_duplicates('key')
drop什么样的行?@B分配给A中的diff行,您只想保持最低时间diff~您的意思是,B中的一行值有可能分配给A中的两行或更多行?那么时差被调低了?我说得对吗?@大陆因为我把公差设置为1分钟,如果你把它设置得很低,我们可以减少将相同的B行分配给多个A行的变化。我只是想让你想到的是保持最小的时差。没别的了。甚至我都担心哪一行会被分配什么样的值?我无法手动检查每一个。你的新专栏和分类确实帮助我理解了我们谈论的时差。我真的很惊讶。谢谢你,汤姆。