如何累计加时间

How to cumulatively add time

我有以分钟为单位的时间间隔。

dfr <- data.frame(interval=c(rep("30",2),rep("60",2)),stringsAsFactors=F)

>> dfr
  interval
1       30
2       30
3       60
4       60

我有一个开始时间,比如说 09:00。

time_begin <- "09:00"

我想从 time_begin 开始并累积添加间隔以获得以下结果:

  interval start   end
1       30 09:00 09:30
2       30 09:30 10:00
3       60 10:00 11:00
4       60 11:00 12:00

使用 dplyr/lubridate 执行此操作的最佳方法是什么?

使用 lubridate 我们可以首先创建 end 列,方法是从 time_begin 开始并添加 interval minutes 的累积总和,然后使用这些值得到start 时间。

library(lubridate)
library(dplyr)

dfr %>%
  mutate(end = time_begin + minutes(cumsum(interval)), 
         start = c(time_begin, end[-n()]))

#  interval                 end               start
#1       30 2019-04-20 09:30:00 2019-04-20 09:00:00
#2       30 2019-04-20 10:00:00 2019-04-20 09:30:00
#3       60 2019-04-20 11:00:00 2019-04-20 10:00:00
#4       60 2019-04-20 12:00:00 2019-04-20 11:00:00

其中

time_begin <- as.POSIXct("09:00:00", format = "%T")

上面的输出中包含今天的日期。要获得与您完全相同的输出,我们可以 format 输出

dfr %>%
  mutate(end = time_begin + minutes(cumsum(interval)), 
         start = c(time_begin, end[-n()]), 
         start = format(start, "%T"), 
         end = format(end, "%T")) %>%
  select(interval, start, end)

#  interval    start      end
#1       30 09:00:00 09:30:00
#2       30 09:30:00 10:00:00
#3       60 10:00:00 11:00:00
#4       60 11:00:00 12:00:00

我们可以在没有任何外部包的情况下做到这一点

v1 <- with(dfr, format(strptime(time_begin, "%H:%M") + 
               c(0, cumsum(as.integer(interval) *60)), "%H:%M"))
transform(dfr, start = v1[-length(v1)], end = v1[-1])
#  interval start   end
#1       30 09:00 09:30
#2       30 09:30 10:00
#3       60 10:00 11:00
#4       60 11:00 12:00