Как накопительно прибавить время - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть временной интервал в минутах.

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?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

Мы можем сделать это без каких-либо внешних пакетов

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
2 голосов
/ 20 апреля 2019

Используя 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
...