Есть три датафрейма немного разной длинны потому что наблюдения велись начиная с разного времени,
как их можно синхронизировать по времени чтоб оставить только те наблюдения которые есть во всех трех фреймах и выкинуть те которые попадаются только в отдельных фреймах
вот сами дата фреймы
> 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
Комментариев нет:
Отправить комментарий