Объедините два набора данных в Python, если даты и время находятся в пределах определенного времени друг с другом, а также создайте «непревзойденный» набор данных - PullRequest
1 голос
/ 16 апреля 2020

У меня есть два набора данных:

df1 и df2, где я хотел бы объединить столбцы из df1, если даты и время находятся в пределах 20 секунд от df2

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

Dput:

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 Ответ

3 голосов
/ 16 апреля 2020

вам нужно прочитать данные и преобразовать их в формат даты и времени - я прочитал данные с помощью буфера обмена и проанализировал там даты. Во-вторых, вам нужно отсортировать данные по ключу (в этом случае ключ «Connect» для df1 и «Start» для 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

надеюсь, что этого достаточно ... в документах есть больше примеров, которые помогут вам, если вас потрясут

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...