Фильтрация объекта datetime для часов бодрствования - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь отфильтровать объект даты-времени по (неопределенно определенным) часам бодрствования по другому часовому поясу. Я придумал следующее с помощью пакета 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 с ним.

...