Round a POSIX date (POSIXct) with base R functionality

Rappster picture Rappster · Jul 4, 2012 · Viewed 17.7k times · Source

I'm currently playing around a lot with dates and times for a package I'm building.

Stumbling across this post reminded me again that it's generally not a bad idea to check out if something can be done with basic R features before turning to contrib packages.

Thus, is it possible to round a date of class POSIXct with base R functionality?

I checked

methods(round)

which "only" gave me

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked

This is what I'd like to do (Pseudo Code)

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"

I know this can be done with timeDate, lubridate etc., but I'd like to keep package dependencies down. So before going ahead and checking out the source code of the respective packages, I thought I'd ask if someone has already done something like this.

Answer

James picture James · Jul 4, 2012

base has round.POSIXt to do this. Not sure why it doesn't come up with 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"