如何累计加时间
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
我有以分钟为单位的时间间隔。
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