Преобразовать столбец времени HMM / HHMM в метку времени в R - PullRequest
1 голос
/ 21 февраля 2020

Я новичок здесь, пожалуйста, будьте осторожны;)

У меня есть два временных столбца в кадре данных в R, который использует формат HMM / HHMM в качестве цифры c. Например, 03:13 будет 313, а 14:14 будет 1414. Примером могут быть sched_arr_time и sched_dep_time в пакете nycflights13.

Мне нужно рассчитать разницу во времени в минутах. Мои SQL знания говорят мне, что я бы подставил это в случай, когда затем каким-то образом склею его обратно как формат времени, но я надеялся, что в R есть более элегантный способ справиться с этим?

Большое спасибо за вашу помощь!

Это объясняет данные:

library(nycflights13)
flights %>% select(sched_dep_time, sched_arr_time)

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Вот еще один вариант использования strptime

as_time <- function(x)
    as.POSIXct(strptime(if_else(nchar(x) == 3, paste0("0", x), as.character(x)), "%H%M"))

flights %>%
    select(sched_dep_time, sched_arr_time) %>%
    mutate(diff_in_mins = difftime(as_time(sched_arr_time), as_time(sched_dep_time), "mins"))
## A tibble: 336,776 x 3
#   sched_dep_time sched_arr_time diff_in_mins
#            <int>          <int> <drtn>
# 1            515            819 184 mins
# 2            529            830 181 mins
# 3            540            850 190 mins
# 4            545           1022 277 mins
# 5            600            837 157 mins
# 6            558            728  90 mins
# 7            600            854 174 mins
# 8            600            723  83 mins
# 9            600            846 166 mins
#10            600            745 105 mins
## … with 336,766 more rows
0 голосов
/ 21 февраля 2020

Мы можем преобразовать во временной класс с as.ITime после изменения формата на HH:MM с str_pad и str_replace, а затем взять разницу с помощью difftime

library(dplyr)
library(stringr)
library(data.table)
flights %>% 
     head %>%
     select(sched_dep_time, sched_arr_time) %>% 
     mutate_all(~ str_pad(., width = 4, pad = 0) %>%
                   str_replace(., '^(..)', '\\1:') %>% 
                   as.ITime) %>%
    mutate(diff = difftime(sched_arr_time, sched_dep_time, unit = 'min'))
# A tibble: 6 x 3
#  sched_dep_time sched_arr_time diff    
#  <ITime>        <ITime>        <drtn>  
#1 05:15:00       08:19:00       184 mins
#2 05:29:00       08:30:00       181 mins
#3 05:40:00       08:50:00       190 mins
#4 05:45:00       10:22:00       277 mins
#5 06:00:00       08:37:00       157 mins
#6 05:58:00       07:28:00        90 mins

Если мы хотим добавить также «Дата», тогда мы

library(lubridate)
flights %>%
   head %>% 
   select(sched_dep_time, sched_arr_time)  %>% 
   mutate_all(~ str_pad(., width = 4, pad = 0) %>%
               str_replace("^(..)(..)", "\\1:\\2:00") %>% 
               str_c(Sys.Date(), ., sep=' ') %>%
               ymd_hms) %>%
   mutate(diff = difftime(sched_arr_time, sched_dep_time, unit = 'min'))
...