17

我有一个小时的向量。例如:

vec.hours <- c("15:52:00", "15:56:00", "12:10:00", "15:12:00",  "11:49:00" ,"13:35:00", "14:53:00")

我想将小时数四舍五入以获得最接近整 5 分钟的新小时数,就像这样。

round.hours <- c("15:50:00", "16:00:00", "12:10:00", "15:10:00",  "11:50:00" ,"13:35:00", "14:55:00" )

我试过这个

hour <- strptime(vec.hours , "%H:%M:%S")
round.hour <- round(hour , "mins")

但它不起作用。

在每个 round.hours 之后,我想做 +/- 一个小时,例如这样:

hour.rd <- strptime(round.hours[1] , "%H:%M:%S")
hourM <- hour.rd - 3600
hourP <- hour.rd + 3600
l.tm <- timeSequence(from = hourM, to = hourP,format = "%H-%S-%M",by="5 min",FinCenter = "Europe/Zurich")

所以,对于 15:50:00,我有一个从 14:50 到 16:50 的时间向量。

我不知道如何从 vec.hours 获取 round.hour。

非常感谢

4

4 回答 4

16

Lubridate有非常友好的round_date功能。

round_date(hour,unit="5 minutes")

[1] "2017-08-28 15:50:00 UTC" "2017-08-28 15:55:00 UTC"
[3] "2017-08-28 12:10:00 UTC" "2017-08-28 15:10:00 UTC"
[5] "2017-08-28 11:50:00 UTC" "2017-08-28 13:35:00 UTC"
[7] "2017-08-28 14:55:00 UTC"
于 2017-08-28T22:36:55.483 回答
10

我会将小时放入 datetime 对象,将它们转换为POSIXlt,这样您就可以将分钟作为整数访问,使用整数除法进行舍入,然后再次提取小时。

timestamps <- as.POSIXlt(as.POSIXct('1900-1-1', tz='UTC') + as.difftime(vec.hours))
timestamps$min <- (timestamps$min + 5/2) %/% 5 * 5
format(timestamps, format='%H:%M:%S')
# [1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00"
于 2013-06-14T12:47:57.877 回答
2

xts包中您可以使用align.time

# align to next whole 5 min interval
align.time(hour, 5*60)
[1] "2013-06-14 15:55:00 CEST" "2013-06-14 16:00:00 CEST" "2013-06-14 12:15:00 CEST" "2013-06-14 15:15:00 CEST"
[5] "2013-06-14 11:50:00 CEST" "2013-06-14 13:40:00 CEST" "2013-06-14 14:55:00 CEST"

这会将时间戳更改为下一个时期的开始,与 OP 略有不同,即从最近的时期开始。

于 2013-06-14T13:01:58.843 回答
1

另一种选择,基于此处的答案- 除以 300(5 分钟 * 60 秒)后四舍五入,然后将结果乘以 300:

format(as.POSIXlt(as.POSIXct('2000-1-1', "UTC") + 
                    round(as.numeric(hours)/300)*300), 
       format = "%H:%M:%S")

#[1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00"
于 2013-06-14T13:04:19.513 回答