Страницы

Поиск по вопросам

суббота, 20 апреля 2019 г.

синхронизация трех датафреймов по времени

Есть три датафрейма немного разной длинны потому что наблюдения велись начиная с разного времени,
как их можно синхронизировать по времени чтоб оставить только те наблюдения которые есть во всех трех фреймах и выкинуть те которые попадаются только в отдельных фреймах
вот сами дата фреймы
> head(sec1) date time open high low close vol 1 2016.09.06 08:45 3081.5 3082.5 3080.5 3080.5 6 2 2016.09.06 08:50 3081.5 3081.5 3079.5 3080.5 6 3 2016.09.06 08:55 3081.5 3082.5 3081.5 3082.5 19 4 2016.09.06 09:00 3083.5 3083.5 3081.5 3082.5 19 5 2016.09.06 09:05 3083.5 3085.5 3082.5 3085.5 8 6 2016.09.06 09:10 3086.5 3086.5 3084.5 3086.5 15 > head(sec2) date time open high low close vol 1 2016.09.13 13:00 95.34 95.40 95.33 95.39 36 2 2016.09.13 13:05 95.40 95.43 95.39 95.41 40 3 2016.09.13 13:10 95.42 95.44 95.40 95.42 37 4 2016.09.13 13:15 95.41 95.42 95.39 95.39 25 5 2016.09.13 13:20 95.40 95.41 95.38 95.38 21 6 2016.09.13 13:25 95.39 95.42 95.38 95.42 32 > head(sec3) date time open high low close vol 1 2016.09.14 18:10 1.12433 1.12456 1.12431 1.12450 137 2 2016.09.14 18:15 1.12444 1.12459 1.12424 1.12455 139 3 2016.09.14 18:20 1.12454 1.12477 1.12446 1.12469 148 4 2016.09.14 18:25 1.12468 1.12474 1.12442 1.12453 120 5 2016.09.14 18:30 1.12452 1.12483 1.12442 1.12482 156 6 2016.09.14 18:35 1.12481 1.12499 1.12472 1.12474 126
Те на выходе должно получиться три датафрейма одинаковой длинны (nrow) и все строчки датафреймов должны иметь одинаковую дату и время


Ответ

Если я правильно понял задачу, то нужно определить пересекающиеся интервалы дат и времени и отфильтровать наблюдения, попадающие в эти интервалы. Омечу, что приведённые в качестве примера данные не пересекаются по датам.
Определим границы для дат:
min_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% min()) %>% max() max_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% max()) %>% min()
Теперь то же самое для времени:
min_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% max() max_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% min()
Теперь можно отфильтровать наблюдения:
df1 <- df1 %>% mutate(date = as.Date(date, format = "%Y.%m.%d")) %>% filter(date >= min_date & date <= max_date) %>% mutate(time = as.POSIXct(time, format = "%H:%M")) %>% filter(time >= min_time & time <= max_time)
Чтобы код работал, нужно загрузить пакет dplyr

Комментариев нет:

Отправить комментарий