Good day,
I have two date columns in as.POSIXct in the format YYYY-MM-DD HH:MM:SS. I would like to get the difference between the two, displayed in the format Days Hours:Seconds. Here is some dummy data:
a<-c("2018-03-20 11:52:25 AST", "2018-03-20 12:51:25 AST", "2018-03-20 14:19:04 AST",
"2018-03-21 14:12:12 AST", "2018-03-21 12:09:22 AST", "2018-03-21 15:28:01 AST")
b<-c("2018-04-09 18:39:38 AST", "2018-06-23 19:13:14 AST", "2018-03-20 23:23:03 AST",
"2018-05-10 21:29:28 AST", "2018-03-22 03:17:23 AST", "2018-05-12 00:19:39 AST")
ab<-data.frame(a,b)
Which gives this data frame:
a b
2018-03-20 11:52:25 AST 2018-04-09 18:39:38 AST
2018-03-20 12:51:25 AST 2018-06-23 19:13:14 AST
2018-03-20 14:19:04 AST 2018-03-20 23:23:03 AST
2018-03-21 14:12:12 AST 2018-05-10 21:29:28 AST
2018-03-21 12:09:22 AST 2018-03-22 03:17:23 AST
2018-03-21 15:28:01 AST 2018-05-12 00:19:39 AST
I would like to get the difference between a and b, or subtract time a from time b to get an output of X days X hours: X seconds.
I have used difftime below, along with the units set differently:
ab$time_difference<-difftime(ab$b, ab$a)
ab
a b time_difference
2018-03-20 11:52:25 AST 2018-04-09 18:39:38 AST 486.786944 hours
2018-03-20 12:51:25 AST 2018-06-23 19:13:14 AST 2286.363611 hours
2018-03-20 14:19:04 AST 2018-03-20 23:23:03 AST 9.066389 hours
2018-03-21 14:12:12 AST 2018-05-10 21:29:28 AST 1207.287778 hours
2018-03-21 12:09:22 AST 2018-03-22 03:17:23 AST 15.133611 hours
2018-03-21 15:28:01 AST 2018-05-12 00:19:39 AST 1232.860556 hours
I have also tried the following:
ab$time_difference<-difftime(ab$b, ab$a,units=c("days","hours","seconds"))
But get the error that 'units' must be a length of 1. Is there a different command I should be using, or is there any way for difftime to produce a more exact time difference?
Thanks!
Since you would like days, hours, minutes, seconds, we can get this result with the lubridate
package:
a<-c("2018-03-20 11:52:25 AST", "2018-03-20 12:51:25 AST", "2018-03-20 14:19:04 AST",
"2018-03-21 14:12:12 AST", "2018-03-21 12:09:22 AST", "2018-03-21 15:28:01 AST")
b<-c("2018-04-09 18:39:38 AST", "2018-06-23 19:13:14 AST", "2018-03-20 23:23:03 AST",
"2018-05-10 21:29:28 AST", "2018-03-22 03:17:23 AST", "2018-05-12 00:19:39 AST")
a = as.POSIXct(a)
b = as.POSIXct(b)
library(lubridate)
timespan = interval(ymd_hms(ab[,1]), ymd_hms(ab[,2]))
> as.period(timespan)
[1] "20d 6H 47M 13S" "3m 3d 6H 21M 49S" "9H 3M 59S" "1m 19d 7H 17M 16S"
[5] "15H 8M 1S" "1m 20d 8H 51M 38S"
If desired, we can convert months to days by specifying the formatting as follows:
> as.period(timespan, unit = "day")
[1] "20d 6H 47M 13S" "95d 6H 21M 49S" "9H 3M 59S" "50d 7H 17M 16S"
[5] "15H 8M 1S" "51d 8H 51M 38S"