Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不完全匹配的时间戳上合并两个数据帧_Python_Pandas_Merge_Time Series_Dataframe - Fatal编程技术网

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))