如果datetimes在彼此的特定时间内,则在Python中连接两个数据集,并创建一个';无与伦比的';数据集
我有两个数据集: df1和df2,如果日期时间在df2的20秒内,我希望列从df1合并到一起如果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
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方向
参数设置为什么<代码>转发<代码>最近的?向前。也许这就是为什么,也许它应该是“最近的”我仍然在学习这一点