2012-07-04 16 views
22

Actualmente estoy jugando mucho con fechas y horas para un paquete que estoy creando.Redondear una fecha POSIX (POSIXct) con funcionalidad base R

Tropezar con este post me recordó una vez más que, en general, no es una mala idea verificar si se puede hacer algo con las características R básicas antes de pasar a los paquetes contrib.

Por lo tanto, ¿es posible redondear una fecha de la clase POSIXct con la funcionalidad base R?

yo nos registramos

methods(round) 

la que "sólo" me dio

[1] round.Date  round.timeDate* 

    Non-visible functions are asterisked 

Esto es lo que me gustaría hacer (Código Pseudo)

x <- as.POSIXct(Sys.time()) 
[1] "2012-07-04 10:33:55 CEST" 

round(x, atom="minute") 
[1] "2012-07-04 10:34:00 CEST" 

round(x, atom="hour") 
[1] "2012-07-04 11:00:00 CEST" 

round(x, atom="day") 
[1] "2012-07-04 CEST" 

Sé que esto puede hacerse con timeDate, lubridate etc., pero me gustaría mantener las dependencias del paquete. Entonces, antes de seguir adelante y verificar el código fuente de los paquetes respectivos, pensé en preguntar si alguien ya había hecho algo como esto.

Respuesta

34

base tiene round.POSIXt para hacer esto. No estoy seguro de por qué no aparece con methods.

x <- as.POSIXct(Sys.time()) 
x 
[1] "2012-07-04 10:01:08 BST" 
round(x,"mins") 
[1] "2012-07-04 10:01:00 BST" 
round(x,"hours") 
[1] "2012-07-04 10:00:00 BST" 
round(x,"days") 
[1] "2012-07-04" 
+0

gran función, pero extrañamente No tiene por semana, mes o año redondeo; para mi situación, tendré que ir con @nichoops respuesta – chepyle

12

Sobre este tema con lubridate, también mirar en los ceiling_date() y floor_date() funciones:

x <- as.POSIXct("2009-08-03 12:01:59.23") 
ceiling_date(x, "second") 
# "2009-08-03 12:02:00 CDT" 
ceiling_date(x, "hour") 
# "2009-08-03 13:00:00 CDT" 
ceiling_date(x, "day") 
# "2009-08-04 CDT" 
ceiling_date(x, "week") 
# "2009-08-09 CDT" 
ceiling_date(x, "month") 
# "2009-09-01 CDT" 
+1

Deseo que el redondeo de mes estuviera disponible para POSIXct, porque floor_date es extremadamente lento. –

Cuestiones relacionadas