Я пытаюсь отфильтровать объект даты-времени по (неопределенно определенным) часам бодрствования по другому часовому поясу. Я придумал следующее с помощью пакета lubridate
:
library(nycflights13)
library(lubridate)
library(dplyr)
Изучение приблизительных дат, связанных с основным часовым поясом
summary(flights$time_hour)
#> Min. 1st Qu. Median
#> "2013-01-01 05:00:00" "2013-04-04 13:00:00" "2013-07-03 10:00:00"
#> Mean 3rd Qu. Max.
#> "2013-07-03 05:22:54" "2013-10-01 07:00:00" "2013-12-31 23:00:00"
Добавление дополнительного часового пояса и создание произвольной проверки событий происходящих во время сна.
second_tz <- "Asia/Tokyo"
df <- flights %>%
mutate(alt_tz = with_tz(time_hour, second_tz)) %>%
select(carrier, tailnum, main_tz = time_hour, alt_tz)
find_sleeping <- function(df) {
df %>%
filter((alt_tz > ymd_hm("2013-01-03 00:00", tz = second_tz) &
alt_tz < ymd_hm("2013-01-03 07:00", tz = second_tz)))
}
find_sleeping(df)
#> # A tibble: 344 x 4
#> carrier tailnum main_tz alt_tz
#> <chr> <chr> <dttm> <dttm>
#> 1 US N945UW 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 2 MQ N546MQ 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 3 UA N11206 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 4 US N957UW 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 5 B6 N784JB 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 6 UA N557UA 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 7 WN N701GS 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 8 AA N3BXAA 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 9 B6 N267JB 2013-01-02 11:00:00 2013-01-03 01:00:00
#> 10 DL N366NB 2013-01-02 11:00:00 2013-01-03 01:00:00
#> # ... with 334 more rows
Создание отдельных векторов с пробуждением и временем сна во вторичном tz, фильтрация и проверка
set_time <- function(dt_vector, hour, minutes) {
hour(dt_vector) <- hour
minute(dt_vector) <- minutes
dt_vector
}
wake <- set_time(df$alt_tz, 7, 0)
bed <- set_time(df$alt_tz, 23, 0)
df %>%
filter(alt_tz > wake & alt_tz < bed) %>%
find_sleeping()
#> # A tibble: 0 x 4
#> # ... with 4 variables: carrier <chr>, tailnum <chr>, main_tz <dttm>,
#> # alt_tz <dttm>
Я не считаю решение особенно элегантным, и set_time
Функция работает несколько медленно. Я пропустил какие-либо другие способы сделать это?
В частности, мне интересно, есть ли в R или lubridate что-то, что будет захватывать время, независимое от даты, то есть понятие "7 утра", независимо от того, какой день может произойти чтобы вы могли сравнить объект datetime с ним.