How to make time difference in same units when subtracting POSIXct
Asked Answered
H

1

28

I want to subtract to POSIXct. I can do this but depending on the first row (i guess?) the difference will be in seconds or minutes. Below you can see the first diff is in seconds and the second diff is in minutes because I changed the time difference in the first row:

#diff in seconds because 1st row time diff is small?
t1<- as.POSIXct(c("2015-02-02 20:18:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
d<-data.frame(t1= t1, t2= t2)
d$t1-d$t2


#diff in seconds because 1st row time diff is larger?
t1<- as.POSIXct(c("2015-02-02 20:13:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
d<-data.frame(t1= t1, t2= t2)
d$t1-d$t2

results:

> #diff in seconds because 1st row time diff is small?
> t1<- as.POSIXct(c("2015-02-02 20:18:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
> t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
> d<-data.frame(t1= t1, t2= t2)
> d$t1-d$t2
Time differences in secs
[1]   1 -60
> 
> 
> #diff in seconds because 1st row time diff is larger?
> t1<- as.POSIXct(c("2015-02-02 20:13:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
> t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
> d<-data.frame(t1= t1, t2= t2)
> d$t1-d$t2
Time differences in mins
[1] -4.983333 -1.000000

I would like the difference to ALWAYS be in seconds no matter what the first row difference is. Is there a way to make this happen?

Thank you.

Hotien answered 28/5, 2015 at 14:53 Comment(3)
difftime(t1, t2, units = "secs")Seamus
Or, if you want to use - instead of difftime, change the unit through units<-. For instance: x<-d$t1-d$t2; units(x)<-"secs"Gogh
@user20650, Ok added. Hope nicola doesn't mind I blended his comment too.Seamus
S
50

You can use difftime for that propose which allows you to specify the measurement units, for example

difftime(t1, t2, units = "secs")

Another way (as mentioned by @nicola and is present in the same documentation) is to take advantage of the fact that - has a -.POSIXt method and override the measurement units after the subtraction operation using units<- replacement method

res <- t1 - t2
units(res) <- "secs"
Seamus answered 28/5, 2015 at 15:25 Comment(5)
units(res) <- "secs" seems not correct. it will also read 6 days as 6 secondsCircinate
@Circinate Not sure what you mean. res <- as.POSIXct("2015-05-02 20:18:02 00:00:00") - as.POSIXct("2015-02-02 20:18:02 00:00:00") ; units(res) <- "secs" seem to work fine.Seamus
yes, above can work. My fault. seems it can only work with element instead of vector or data frame. my code example > res <- as.POSIXct("2015-05-02 20:18:02 00:00:00") - as.POSIXct("2015-02-02 20:18:02 00:00:00") > res <- rbind(res,res) > as.numeric(res,units="secs")Circinate
@Circinate That's because rbind caused it to lose its difftime class and units only works with that class (as documented under ?units). This works on vectors as long they have the proper class. Try res <- as.POSIXct(c("2015-05-02 20:18:02 00:00:00", "2015-05-02 20:18:02 00:00:00")) - as.POSIXct(c("2015-02-02 20:18:02 00:00:00", "2015-02-02 20:18:02 00:00:00")) ; units(res) <- "secs" for instance.Seamus
thanks @David. Yes, you're right. I solved the problem with lappy to each instance.Circinate

© 2022 - 2024 — McMap. All rights reserved.