Объединить два набора данных с условными датами и показать несопоставимые значения - PullRequest
0 голосов
/ 13 апреля 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

Выход:

df1

structure(list(Connect = structure(c(4L, 2L, 3L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "3/31/2020 11:00:08 AM", 
"4/1/2020 10:00:05 PM", "4/6/2020 1:15:21 PM"), class = "factor"), 
Ended = structure(c(4L, 2L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("", "3/31/2020 11:00:10 AM", "4/1/2020 12:00:05 PM", 
"4/6/2020 2:05:18 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
 -13L))



df2

structure(list(Start = structure(2:1, .Label = c("3/31/2020 11:00:10 AM", 
"4/6/2020 1:15:21 PM"), class = "factor"), End = structure(2:1, .Label = c("3/31/2020 11:00:14 AM", 
"4/6/2020 2:05:18 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))

Что я пробовал:

pd.merge_asof(df1, df2, on="Connect", "Ended", by='ticker',       tolerance=pd.Timedelta('20 s'), direction='backward')

Однако, как мне включить условие 20 секунд, а также показать непревзойденный набор данных?

Любое предложение приветствуется

1 Ответ

1 голос
/ 13 апреля 2020

Мы можем использовать crossing для создания всех комбинаций df1 и df2 и сохранять только те строки, которые находятся в пределах 20-секундного интервала.

library(tidyr)
library(dplyr)
library(lubridate)

df3 <- crossing(df1, df2) %>%
          mutate_all(mdy_hms) %>%
          filter(abs(difftime(Connect, Start, units = "secs")) <= 20 &
                 abs(difftime(Ended, End, units = "secs")) <= 20)

df3
# A tibble: 2 x 4
#  Connect             Ended               Start               End                
#  <dttm>              <dttm>              <dttm>              <dttm>             
#1 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

Чтобы получить df4, мы можем сделать:

df4 <- df1 %>% mutate_all(mdy_hms) %>% anti_join(df3, by = c('Connect', 'Ended'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...