为了账号安全,请及时绑定邮箱和手机立即绑定

如果日期时间在某个时间范围内,则在 Python 中加入两个数据集,并创建一个“不匹配”数据集

如果日期时间在某个时间范围内,则在 Python 中加入两个数据集,并创建一个“不匹配”数据集

宝慕林4294392 2022-10-11 17:11:26
我有两个数据集:df1 和 df2,如果日期时间在 df2 的 20 秒内,我希望列从 df1 合并在一起df1Connect                 Ended4/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM3/31/2020 11:00:08 AM   3/31/2020 11:00:10 AM4/1/2020 10:00:05 PM    4/1/2020 12:00:05 PMdf2Start                   End4/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM3/31/2020 11:00:10 AM   3/31/2020 11:00:14 AM期望的输出:df3Match_Start1             Match_End1                     Match_Start2              Match_End24/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM          4/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM3/31/2020 11:00:08 AM   3/31/2020 11:00:10 AM        3/31/2020 11:00:10 AM   3/31/2020 11:00:14 AM    df4(不匹配)Unmatched_Start         Unmatched_end  4/1/2020 10:00:05 PM    4/1/2020 12:00:05 PM输入:df1   :   '  Connect   Ended\n0    4/6/2020 1:15:21 PM     4/6/2020 2:05:18 PM\n1     3/31/2020 11:08:08 AM  3/31/2020 11:00:10 AM\n2   4/1/2020 10:00:05 PM    4/1/2020 12:00:05    PM'df2  Out[117]:  '    Start    End\n0    4/6/2020 1:15:21 PM    4/6/2020 2:05:18 PM\n1       3/31/2020 11:08:08 AM  3/31/2020 11:00:14 AM\n2                    NaN                    NaN'我在想什么:df2 = pd.merge_asof(df1, df2, on="Connect", by = "Ended", tolerance=pd.Timedelta('20s'), direction='backward')但是,如何合并 20 秒的条件,以及显示不匹配的数据集?任何建议表示赞赏
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您需要读入数据并转换为日期时间格式 - 我用剪贴板读入数据并在那里解析日期。其次,您需要按键对数据进行排序(在这种情况下,键是 df1 的“连接”和 df2 的“开始”)。在那之后 pandas merge_asof就足够了。请注意,合并只能在一个键上发生,而不是多个:

对数据框进行排序

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

希望它就足够了......如果你被踩到,文档有更多的例子来指导你


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号