Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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
如果datetimes在彼此的特定时间内,则在Python中连接两个数据集,并创建一个';无与伦比的';数据集_Python_Pandas_Numpy_Datetime - Fatal编程技术网

如果datetimes在彼此的特定时间内,则在Python中连接两个数据集,并创建一个';无与伦比的';数据集

如果datetimes在彼此的特定时间内,则在Python中连接两个数据集,并创建一个';无与伦比的';数据集,python,pandas,numpy,datetime,Python,Pandas,Numpy,Datetime,我有两个数据集: df1和df2,如果日期时间在df2的20秒内,我希望列从df1合并到一起 df1 Connect Ended 4/6/2020 1:15:21 PM 4/6/2020 2:05:18 PM 3/31/2020 11:00:08 AM 3/31/2020 11:00:10 AM 4/1/2020 10:00:05 PM 4/1/2020 12:00:05 PM df2 期望输出: df3 df4(不匹配) D

我有两个数据集:

df1和df2,如果日期时间在df2的20秒内,我希望列从df1合并到一起

df1





Connect                 Ended


4/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM

3/31/2020 11:00:08 AM   3/31/2020 11:00:10 AM

4/1/2020 10:00:05 PM    4/1/2020 12:00:05 PM
df2

期望输出:

df3

df4(不匹配)

Dput:

df1

df2

我的想法是:

df2 = pd.merge_asof(df1, df2, on="Connect", by = "Ended", 
tolerance=pd.Timedelta('20s'), direction='backward')
但是,如何合并20秒的条件,以及显示不匹配的数据集


如果您有任何建议,我们将不胜感激。

您需要读入数据并转换为datetime格式-我读入数据并解析其中的日期。其次,您需要按键对数据进行排序(在本例中,键对于df1为“Connect”,对于df2为“Start”)。在那之后,熊猫就足够了。请注意,合并只能在一个键上发生,不能在多个键上发生:

对数据帧进行排序

df1 = df1.sort_values(['Connect','Ended'])
df2 = df2.sort_values(['Start','End'])
merger = pd.merge_asof(df1,df2,
                       left_on='Connect',
                       right_on='Start',
                       tolerance = pd.Timedelta('20s'),
                       direction='forward')

merger

     Connect                   Ended            Start              End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
1   2020-04-01 22:00:05 2020-04-01 12:00:05        NaT             NaT
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18
合并数据帧

df1 = df1.sort_values(['Connect','Ended'])
df2 = df2.sort_values(['Start','End'])
merger = pd.merge_asof(df1,df2,
                       left_on='Connect',
                       right_on='Start',
                       tolerance = pd.Timedelta('20s'),
                       direction='forward')

merger

     Connect                   Ended            Start              End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
1   2020-04-01 22:00:05 2020-04-01 12:00:05        NaT             NaT
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18
应易于选择匹配和不匹配的行:

matched = merger.dropna()
matched


         Connect              Ended                    Start         End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18

unmatched = merger.loc[merger.isna().any(axis=1)]
unmatched

    Connect               Ended           Start End
1   2020-04-01 22:00:05 2020-04-01 12:00:05 NaT NaT

希望它足够。。。如果你被踩了,文档中有更多的例子来指导你,你需要读入数据并转换为日期时间格式-我读入数据并解析其中的日期。其次,您需要按键对数据进行排序(在本例中,键对于df1为“Connect”,对于df2为“Start”)。在那之后,熊猫就足够了。请注意,合并只能在一个键上发生,不能在多个键上发生:

对数据帧进行排序

df1 = df1.sort_values(['Connect','Ended'])
df2 = df2.sort_values(['Start','End'])
merger = pd.merge_asof(df1,df2,
                       left_on='Connect',
                       right_on='Start',
                       tolerance = pd.Timedelta('20s'),
                       direction='forward')

merger

     Connect                   Ended            Start              End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
1   2020-04-01 22:00:05 2020-04-01 12:00:05        NaT             NaT
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18
合并数据帧

df1 = df1.sort_values(['Connect','Ended'])
df2 = df2.sort_values(['Start','End'])
merger = pd.merge_asof(df1,df2,
                       left_on='Connect',
                       right_on='Start',
                       tolerance = pd.Timedelta('20s'),
                       direction='forward')

merger

     Connect                   Ended            Start              End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
1   2020-04-01 22:00:05 2020-04-01 12:00:05        NaT             NaT
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18
应易于选择匹配和不匹配的行:

matched = merger.dropna()
matched


         Connect              Ended                    Start         End
0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:14
2   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18

unmatched = merger.loc[merger.isna().any(axis=1)]
unmatched

    Connect               Ended           Start End
1   2020-04-01 22:00:05 2020-04-01 12:00:05 NaT NaT

希望它足够。。。文档中有更多的例子来指导你,如果你被踩死了

可能重复嗨,我不相信这是重复的,因为我没有看到不匹配的数据集。我的问题是根据两个数据集之间是否在20秒内进行链接。可能重复嗨,我不认为这是重复的,因为我没有看到不匹配的数据集。我的问题是,根据两个数据集之间的距离是否在20秒内,将它们链接起来。啊,好的,谢谢!我走对了路,但一路上被难倒了!非常感谢。是的,你在正确的轨道上。我们有时都会被踩死。该回去工作了。干杯嗨@Sammywemmy,我只是想知道,公差timedelta('20s'),它到底是什么意思?这是否意味着这两个4/9/2020 9:40:33 AM 4/9/2020 9:52:35 AM 4/9/2020 9:40:34 AM 4/9/2020 9:52:35 AM应该匹配,因为只有一秒的差异?因为当我运行代码时,这些时间戳位于“unmatched”数据集中。我在想20秒的公差会包括它。我也在研究文档。谢谢ur
方向
参数设置为什么<代码>转发<代码>最近的?向前。也许这就是为什么,也许它应该是“最近的”我还在学习这个啊好的谢谢!我走对了路,但一路上被难倒了!非常感谢。是的,你在正确的轨道上。我们有时都会被踩死。该回去工作了。干杯嗨@Sammywemmy,我只是想知道,公差timedelta('20s'),它到底是什么意思?这是否意味着这两个4/9/2020 9:40:33 AM 4/9/2020 9:52:35 AM 4/9/2020 9:40:34 AM 4/9/2020 9:52:35 AM应该匹配,因为只有一秒的差异?因为当我运行代码时,这些时间戳位于“unmatched”数据集中。我在想20秒的公差会包括它。我也在研究文档。谢谢ur
方向
参数设置为什么<代码>转发<代码>最近的?向前。也许这就是为什么,也许它应该是“最近的”我仍然在学习这一点