2012-09-26 26 views
9

sto cercando di sottrarre 2 vettori di caratteri contenenti informazioni in tempo la data nel seguente formato:R Trova differenza di tempo in secondi per AAAA-MM-GG HH: MM: SS.mmm

> dput(train2) 

structure(list(time2 = c("2011-09-01 23:44:52.533", "2011-09-05 12:25:37.42", 
"2011-08-24 12:56:58.91", "2011-10-25 07:18:14.722", "2011-10-25 07:19:51.697" 
), time3 = c("2011-09-01 23:43:59.752", "2011-09-05 12:25:01.187", 
"2011-08-24 12:55:13.012", "2011-10-25 07:16:51.759", "2011-10-25 07:16:51.759" 
)), .Names = c("time2", "time3"), row.names = c(NA, 5L), class = "data.frame") 

I' Ho cercato e giocato con zoo, as.Date, as.POSIXct, ecc. per cercare di trovare il codice corretto per sottrarre 2 oggetti datetime e ottenere una risposta in pochi secondi ma senza fortuna.

Apprezzerei qualsiasi suggerimento.

risposta

12

Easy Peasy:

R> now <- Sys.time() 
R> then <- Sys.time() 
R> then - now 
Time difference of 5.357 secs 
R> class(then - now) 
[1] "difftime" 
R> as.numeric(then - now) 
[1] 5.357 
R> 

E per i dati:

R> df 
        time2     time3 
1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752 
2 2011-09-05 12:25:37.42 2011-09-05 12:25:01.187 
3 2011-08-24 12:56:58.91 2011-08-24 12:55:13.012 
4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759 
5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759 
R> df$time2 <- strptime(df$time2, "%Y-%m-%d %H:%M:%OS") 
R> df$time3 <- strptime(df$time3, "%Y-%m-%d %H:%M:%OS") 
R> df 
        time2     time3 
1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752 
2 2011-09-05 12:25:37.420 2011-09-05 12:25:01.187 
3 2011-08-24 12:56:58.910 2011-08-24 12:55:13.012 
4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759 
5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759 
R> df$time2 - df$time3 
Time differences in secs 
[1] 52.781 36.233 105.898 82.963 179.938 
attr(,"tzone") 
[1] "" 
R> 

e ha aggiunto indietro come un numerico per il frame di dati:

R> df$dt <- as.numeric(df$time2 - df$time3) 
R> df 
        time2     time3  dt 
1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752 52.781 
2 2011-09-05 12:25:37.420 2011-09-05 12:25:01.187 36.233 
3 2011-08-24 12:56:58.910 2011-08-24 12:55:13.012 105.898 
4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759 82.963 
5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759 179.938 
R> 
+0

Grazie mille. Non l'avrei mai ottenuto da solo. La roba per la data è per me "sconosciuto" (da prendere in prestito da Don Rumsfeld). – screechOwl

+11

Potrebbe valere la pena sottolineare che è possibile forzare la differenza di fuso orario in una particolare unità di tempo usando 'difftime (then, now, units =" secs ")' o 'difftime (quindi, now, units =" mins ") 'ecc ... Vedi'? difftime' – thelatemail

+0

@screechOwl: Come per molte cose R, a volte ci si graffia la testa e sbatte la fronte, ma è molto, molto potente. Sicuramente vale la pena imparare. –

14
> x1<-"2013-03-03 23:26:46.315" 
> x2<-"2013-03-03 23:31:53.091" 
> x1 <- strptime(x1, "%Y-%m-%d %H:%M:%OS") 
> x2 <- strptime(x2, "%Y-%m-%d %H:%M:%OS") 
> x1 
[1] "2013-03-03 23:26:46" 
> x2 
[1] "2013-03-03 23:31:53" 

Ho seguito la risposta di @Dirk Eddelbuettel, ma io sono losi precisione. Come posso costringere R a non tagliare parti del secondo?

fortuna (uomo di strptime) ho risposto alla mia domanda me:

op <- options(digits.secs = 3) 

Dopo aver applicato questa impostazione la precisione saranno utilizzati.

http://stat.ethz.ch/R-manual/R-devel/library/base/html/strptime.html

La belowe può essere utile se si desidera ottenere la differenza in pochi secondi, ma entrare in minuti:

> as.numeric(x2-x1,units="secs") 
[1] 306.776 
Problemi correlati