Python 在不完全匹配的时间戳上合并两个数据帧
我试着在网站上搜索一个很好的方法来实现这一点(也尝试了一些关于装箱和时间序列的想法),但仍然找不到合适的解决方案 问题就在这里 我有两个数据帧:Python 在不完全匹配的时间戳上合并两个数据帧,python,pandas,merge,time-series,dataframe,Python,Pandas,Merge,Time Series,Dataframe,我试着在网站上搜索一个很好的方法来实现这一点(也尝试了一些关于装箱和时间序列的想法),但仍然找不到合适的解决方案 问题就在这里 我有两个数据帧: index name time price 1, AAA, 11:37:09.359479, 58.480000,10 2, ABC, 11:37:15.403268, 0.5000000,3 3, ABB, 11:37:15.491515, 0.4500000,2 4,
index name time price
1, AAA, 11:37:09.359479, 58.480000,10
2, ABC, 11:37:15.403268, 0.5000000,3
3, ABB, 11:37:15.491515, 0.4500000,2
4, AAA, 11:37:15.604864, 0.5000000,1
5, ABC, 11:37:16.628756, 0.1800000,20
6, ABD, 11:37:21.083105, 0.8000000,7
7, AAA, 11:37:21.423480, 79.030000,10
index name time price
1, ABB, 11:37:15.491525, 0.4500000,2
2, AAA, 11:37:15.604884, 0.5000000,1
3, ABC, 11:37:16.628796, 0.1800000,20
如您所见,dataframe 1中的索引3,4,5具有dataftame 2中相应的索引1,2,3
我需要将这些数据帧合并到一个on'time'列中,以便数据帧1中的记录3,4,5的索引1,2,3位于右侧
结果应该是:
index_x name_x time_x price_x name_y time_y price_y
1, AAA, 11:37:09.359479, 58.480000,10 Nan ...
2, ABC, 11:37:15.403268, 0.5000000,3 Nan ..
3, ABB, 11:37:15.491515, 0.4500000,2 ABB, 11:37:15.491525, 0.4500000,2
4, AAA, 11:37:15.604864, 0.5000000,1 AAA, 11:37:15.604884, 0.5000000,1
5, ABC, 11:37:16.628756, 0.1800000,20 ABC, 11:37:16.628796, 0.1800000,20
6, ABD, 11:37:21.083105, 0.8000000,7 Nan ..
7, AAA, 11:37:21.423480, 79.030000,10 Nan ..
我有麻烦,因为时间不完全一样(看最后2微秒)。有没有一个很好的方法来合并它?如果时间不完全匹配,但是给定一些匹配阈值,那么就可以及时合并这些数据?此外,每个记录只能有一个匹配项
如果清楚的话,请告诉我
提前非常感谢 不幸的是,这些“亲密匹配”在熊猫身上很少有一个超级简单的解决方案,但这并不太糟糕。你可以做的是从@CharlieHaley的解决方案开始,然后把它放在一个循环中,这样你就可以进行最精确的匹配,而放弃不太精确的匹配
当然,这仍然让您决定使用哪种精度级别(如“decimal_range”中指定的)。我将范围从7开始,以保持输出简洁,但您希望从1开始,然后决定希望运行多高,因为数字越大,匹配精度越低
df4
index name time_x price_x time2 time_y price_y
0 2 ABB 11:37:15.491515 0.45 11:37:15 11:37:15.491525 0.45
1 3 AAA 11:37:15.604864 0.50 11:37:15 11:37:15.604884 0.50
2 4 ABC 11:37:16.628756 0.18 11:37:16 11:37:16.628796 0.18
0 1 ABC 11:37:15.403268 0.50 11:37:1 11:37:16.628796 0.18
(注意:我假设您的初始数据帧是'df1'和'df2',并且'time'是字符串,如果不是,您需要首先将其转换为字符串。)
显示中间输出可能会使这一点更加清楚。在i=7
处合并时,有3个匹配项,但在i=8
处有4个匹配项。“time2”列显示用于匹配的精度
df3
index name time_x price_x time2 time_y price_y
0 2 ABB 11:37:15.491515 0.45 11:37:15 11:37:15.491525 0.45
1 3 AAA 11:37:15.604864 0.50 11:37:15 11:37:15.604884 0.50
2 4 ABC 11:37:16.628756 0.18 11:37:16 11:37:16.628796 0.18
0 1 ABC 11:37:15.403268 0.50 11:37:1 11:37:16.628796 0.18
1 4 ABC 11:37:16.628756 0.18 11:37:1 11:37:16.628796 0.18
2 2 ABB 11:37:15.491515 0.45 11:37:1 11:37:15.491525 0.45
3 3 AAA 11:37:15.604864 0.50 11:37:1 11:37:15.604884 0.50
累积匹配后,只需删除重复项即可保持更精确的匹配
df4
index name time_x price_x time2 time_y price_y
0 2 ABB 11:37:15.491515 0.45 11:37:15 11:37:15.491525 0.45
1 3 AAA 11:37:15.604864 0.50 11:37:15 11:37:15.604884 0.50
2 4 ABC 11:37:16.628756 0.18 11:37:16 11:37:16.628796 0.18
0 1 ABC 11:37:15.403268 0.50 11:37:1 11:37:16.628796 0.18
我最后做的是将数据帧分割成相等的存储箱,然后在存储箱ID上合并它们 这样做的一个缺点是,我只能对这两个数据帧中的“公共”/“共享”时间间隔(对于第一个数据帧中的索引3、4、5)这样做 同样,在同一个箱子中可能有多条记录,在本例中,我只使用了要合并的两边的最后一条记录 这就是我要做的(我的数据帧名称是onTrade1和onTrade2):
然后我可以简单地在公共索引上将groups1与groups2合并。假设您的时间是一个字符串,您可以简单地做的一件事就是去掉时间的最后两到三位数字,然后执行连接。e、 这是我的第一个想法,但是这会产生一些重复的连接。。我需要一种方法来唯一地连接这些记录,这意味着为每个记录找到一个最接近的匹配时间(最小的绝对差)。谢谢你的回复,这是一个好主意,我可能会尝试这种方法来解决这个问题
commonFirstTime = max (onTrade1['exchangeTime'].min(), onTrade2['exchangeTime'].min())
commonLastTime = min (onTrade1['exchangeTime'].max(), onTrade2['exchangeTime'].max())
bins = numpy.linspace(commonFirstTime, commonLastTime, ((commonLastTime - commonFirstTime) / 1000))
groups1 = onTrade1.groupby(numpy.digitize(onTrade1['exchangeTime'], bins))
groups2 = onTrade2.groupby(numpy.digitize(onTrade2['exchangeTime'], bins))