猿问

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

我有两个数据集:


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


Start                   End



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


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

期望的输出:


df3


Match_Start1             Match_End1                     Match_Start2              Match_End2




4/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 PM


3/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 秒的条件,以及显示不匹配的数据集?


任何建议表示赞赏


宝慕林4294392
浏览 148回答 1
1回答

温温酱

您需要读入数据并转换为日期时间格式 - 我用剪贴板读入数据并在那里解析日期。其次,您需要按键对数据进行排序(在这种情况下,键是 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              End0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:141   2020-04-01 22:00:05 2020-04-01 12:00:05        NaT             NaT2   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         End0   2020-03-31 11:00:08 2020-03-31 11:00:10 2020-03-31 11:00:10 2020-03-31 11:00:142   2020-04-06 13:15:21 2020-04-06 14:05:18 2020-04-06 13:15:21 2020-04-06 14:05:18unmatched = merger.loc[merger.isna().any(axis=1)]unmatched    Connect               Ended           Start End1   2020-04-01 22:00:05 2020-04-01 12:00:05 NaT NaT希望它就足够了......如果你被踩到,文档有更多的例子来指导你
随时随地看视频慕课网APP

相关分类

Python
我要回答