Вычислить разницу во времени между двумя переменными чч:мм в течение дня

У меня проблема с вычислением разницы во времени между двумя переменными. Чтобы было ровно время между засыпанием и пробуждением. Я думал об использовании хрона для этого, и это мой пример.

DF <- data.frame(time_start = c("20:00", "21:30", "22:00", "23:00", "00:30", "02:00", "04:00"),
                 time_end = c("03:00", "06:30", "07:00", "09:00", "5:30", "09:00", "10:00"))

library(chron)
DF$time_start <- paste0(DF$time_start, ":00")
DF$time_start <- chron(times. =DF$time_start)
DF$time_end <- paste0(DF$time_end, ":00")
DF$time_end <- chron(times. =DF$time_end)
DF$time_duration <- times(DF$time_end - DF$time_start)

Форматирование переменных с помощью chron работает частично так, как предполагалось. Резюме для time_end выглядит хорошо. time_start, с другой стороны, довольно грязный. И time_duration является десятичным.

> summary(DF$time_start)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
00:30:00 03:00:00 20:00:00 13:17:09 21:45:00 23:00:00 
> summary(DF$time_end)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
03:00:00 06:00:00 07:00:00 07:08:34 09:00:00 10:00:00 
> summary(DF$time_duration)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.7083333 -0.6250000 -0.5833333 -0.2559524  0.2291667  0.2916667 

Мои вопросы:

Как я могу получить правдоподобные сводные результаты для time_start и

как я могу получить разницу между time_start и time_end в более читаемом виде, например, в часах? Заранее спасибо за помощь!


person Schillerlocke    schedule 27.04.2020    source источник
comment
Взгляните на смазку пакета tidyverse и его шпаргалку.   -  person Mark Neal    schedule 27.04.2020
comment
Хорошо, я могу сократить весь предыдущий код с помощью библиотеки (смазать) DF$time_duration ‹- hm(DF$time_end) - hm(DF$time_start) и получить удобочитаемое время. Но продолжительность по-прежнему отрицательная, например, 20:00 - 03:00 = -17 часов вместо 7 часов. Как решить эту проблему?   -  person Schillerlocke    schedule 27.04.2020


Ответы (1)


Это дает правильную продолжительность в случае, если end_time совпадает или на следующий день с start_time:

library(tidyverse)

DF <- data.frame(time_start = c("20:00", "21:30", "22:00", "23:00", "00:30", "02:00", "04:00"),
                 time_end = c("03:00", "06:30", "07:00", "09:00", "5:30", "09:00", "10:00")) %>% 
  mutate_at(vars(starts_with("time")), hm) %>% 
  mutate(time_duration = if_else(
    time_end > time_start,
    time_end - time_start,
    hm("24:00") - time_start + time_end)
  )

DF
  time_start  time_end time_duration
1  20H 0M 0S  3H 0M 0S      7H 0M 0S
2 21H 30M 0S 6H 30M 0S      9H 0M 0S
3  22H 0M 0S  7H 0M 0S      9H 0M 0S
4  23H 0M 0S  9H 0M 0S     10H 0M 0S
5     30M 0S 5H 30M 0S      5H 0M 0S
6   2H 0M 0S  9H 0M 0S      7H 0M 0S
7   4H 0M 0S 10H 0M 0S      6H 0M 0S
person Piotr K    schedule 27.04.2020