Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Date-time differences between rows in R

Tags:

r

I would like to calculate time differences (delta time) in R. The timestamps are stored in a two-column data frame with time as date-time (year-month-day hour:min: sec.msec), e.g. for first three rows:

c_id    c_time
6875    2012-08-15 00:00:40.169
6874    2012-08-15 00:01:40.055
6876    2012-08-15 00:02:40.542

I would like to have an output a column with differences e.g.

c_diff
0
00:01:0.886
00:01:0.487

Can someone please tell me how to do this? If you have other/better suggestion how to keep the result, it will be greatly appreciated Thanks so much in advance! Mishu

like image 279
Mishu Avatar asked Mar 19 '13 17:03

Mishu


People also ask

How do I calculate time difference between rows in R?

You can use the difftime() function to calculate the time difference between two dates or datetimes in R.


2 Answers

Try this (I am assuming that you have your data in a data.frame called mydf) and that you want the difference between the first time stamp and all subsequent timestamps:

c_time <- as.POSIXlt( mydf$c_time )
difftime( c_time[1] , c_time[2:length(c_time)] )
  #Time differences in secs
  #[1]  -59.886 -120.373
  #attr(,"tzone")
  #[1] ""

Edit

But in case you want the delta difference between subsequent timestamps you need to reverse your obsevations (because the first way round you get time1 - time2 which will be negative), so you can just use instead:

c_time <- rev( c_time )
difftime(c_time[1:(length(c_time)-1)] , c_time[2:length(c_time)])
  #Time differences in secs
  #[1] 60.487 59.886
  #attr(,"tzone")
  #[1] ""
like image 134
Simon O'Hanlon Avatar answered Sep 24 '22 02:09

Simon O'Hanlon


I will not give you the entire answer, but this will help you almost get there:

x="2012-07-11 04:22:40.169"
datex=strptime(x,format='%Y-%m-%d %H:%M:%S') #this converts your date string 
#into a date value recognized in r

y="2012-08-15 08:32:40.169"
datey=strptime(y,format='%Y-%m-%d %H:%M:%S')

time_diff=as.numeric(difftime(datey,datex)) #in decimal days
>35.17361

From decimal days you can then convert it back to whichever time format you want, but depending on what you want to do with it, you may want to keep it in a numeric form (perhaps in decimal hours, by multiplying time_diff by 24)...

like image 42
Lucas Fortini Avatar answered Sep 26 '22 02:09

Lucas Fortini