Convert time interval to number in R
Published on
Let’s say you have two time values in R, t1 and
t2, and you want to compute the distance between them.
A natural thing to try would be
as.numeric(t1-t2)This should probably return a number in seconds, but it might be in some other units, so you test just to be safe:
> as.numeric(as.POSIXct("2017-05-17 19:00:10")-as.POSIXct("2017-05-17 19:00:00"))
[1] 10“Ok,” you think, “seconds it is,” and proceed to use an expression like the above in your code.
You just fell victim to an incredibly nasty “feature” of the R
date/time API. The as.numeric and other similar functions
actually choose the units based on the length of the interval by
default:
> as.numeric(as.POSIXct("2007-05-07 09:00:10")-as.POSIXct("2007-05-07 09:00:00"))
[1] 10
> as.numeric(as.POSIXct("2007-05-07 09:10:00")-as.POSIXct("2007-05-07 09:00:00"))
[1] 10
> as.numeric(as.POSIXct("2007-05-07 19:00:00")-as.POSIXct("2007-05-07 09:00:00"))
[1] 10
> as.numeric(as.POSIXct("2007-05-17 09:00:00")-as.POSIXct("2007-05-07 09:00:00"))
[1] 10To get a consistent behavior, you need to specify the units, e.g.:
> as.numeric(as.POSIXct("2007-05-17 09:00:00")-as.POSIXct("2007-05-07 09:00:00"), units="secs")
[1] 864000The acceptable units values are "auto",
"secs", "mins", "hours",
"days", and "weeks".