舍入时间到最近的四分之一小时

Dom*_*nic 27 datetime r

我有一个POSIXct值的向量,我想将它们舍入到最近的四分之一小时.我不关心这一天.如何将值转换为小时和分钟?

例如,我想要的价值

"2012-05-30 20:41:21 UTC"
Run Code Online (Sandbox Code Playgroud)

成为

"20:45"
Run Code Online (Sandbox Code Playgroud)

小智 22

实际上,到目前为止,一个老问题和一些有用的答案.giraffhere的最后一个似乎是最优雅的.但是,不是floor_date而是round_date,它可以解决这个问题:

lubridate::round_date(x, "15 minutes") 
Run Code Online (Sandbox Code Playgroud)


Pie*_*nte 21

你可以用round.诀窍是在舍入之前除以900秒(15分钟*60秒)并在之后乘以900:

a <-as.POSIXlt("2012-05-30 20:41:21 UTC")
b <-as.POSIXlt(round(as.double(a)/(15*60))*(15*60),origin=(as.POSIXlt('1970-01-01')))
b
[1] "2012-05-30 20:45:00 EDT"
Run Code Online (Sandbox Code Playgroud)

要获得时间和分钟,只需使用格式

format(b,"%H:%M")
[1] "20:45"

as.character(format(b,"%H:%M"))
[1] "20:45"
Run Code Online (Sandbox Code Playgroud)

  • 我不认为我们需要一个double,并且origin接受一个字符串,所以稍微简化:`b <-as.POSIXlt(round(as.numeric(a)/(15*60))*(15*60),原点= '1970-01-01')` (2认同)

shh*_*its 14

就像是

format(strptime("1970-01-01", "%Y-%m-%d", tz="UTC") + round(as.numeric(your.time)/900)*900,"%H:%M")
Run Code Online (Sandbox Code Playgroud)

会工作


gir*_*ere 13

老问题,但是要注意lubridate包现在可以轻松处理floor_date.要将POSIXct对象的矢量切割为15分钟的间隔,请使用这样的方法.

x <- lubridate::floor_date(x, "15 minutes")

编辑:由用户@ user3297928注释,lubridate::round_date(x, "15 minutes")用于舍入到最近的15分钟.它上面的楼层.


Jos*_*ich 5

您可以使用align.timexts 包中的函数来处理舍入,然后format返回字符串“HH:MM”:

R> library(xts)
R> p <- as.POSIXct("2012-05-30 20:41:21", tz="UTC")
R> a <- align.time(p, n=60*15)  # n is in seconds
R> format(a, "%H:%M")
[1] "20:45"
Run Code Online (Sandbox Code Playgroud)

  • 这很优雅,但似乎只是四舍五入。 (5认同)