R 计算一天内两个hh:mm变量之间的时差

R 计算一天内两个hh:mm变量之间的时差,r,time,chron,R,Time,Chron,我在计算两个变量之间的时间差时遇到了一个问题。正好是从睡着到醒来的时间。我考虑过使用chron来实现这一点,这就是我的例子 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

我在计算两个变量之间的时间差时遇到了一个问题。正好是从睡着到醒来的时间。我考虑过使用chron来实现这一点,这就是我的例子

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)
我的问题是:

我如何才能获得时间和开始的合理总结结果


我如何以更易读的方式(如小时)获得时间开始和时间结束之间的差异?提前谢谢你的帮助

如果
结束时间
开始时间相同或第二天相同,则给出正确的持续时间:

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
库(tidyverse)
DF%
在(变量(以“时间”开头),hm)%>%
变异(时间\持续时间=如果其他(
时间结束>时间开始,
时间结束-时间开始,
hm(“24:00”)-开始时间+结束时间)
)
DF
时间\开始时间\结束时间\持续时间
1 20H 0M 0S 3H 0M 0S 7H 0M 0S
2 21小时30米0秒6小时30米0秒9小时0米0秒
3 22小时0米0秒7小时0米0秒9小时0米0秒
4 23H 0M 0S 9H 0M 0S 10H 0M 0S
5 30米0秒5小时30米0秒5小时0米0秒
6小时0米0秒9小时0米0秒7小时0米0秒
7 4H 0M 0S 10H 0M 0S 6H 0M 0S

看看tidyverse软件包lubridate及其备忘单。好的,我可以通过“library(lubridate)DF$time\u duration”缩短前面的所有代码
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