26

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.

zx8754
  • 52,746
  • 12
  • 114
  • 209
user3022875
  • 8,598
  • 26
  • 103
  • 167

1 Answers1

48

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"
David Arenburg
  • 91,361
  • 17
  • 137
  • 196
  • units(res) <- "secs" seems not correct. it will also read 6 days as 6 seconds – HappyCoding May 09 '17 at 05:43
  • @HappyCoding 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. – David Arenburg May 09 '17 at 05:48
  • 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")``` – HappyCoding May 12 '17 at 08:22
  • @HappyCoding 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. – David Arenburg May 12 '17 at 10:51
  • thanks @David. Yes, you're right. I solved the problem with lappy to each instance. – HappyCoding May 14 '17 at 12:56