2012-09-26 11 views
9

Ich versuche, 2 Zeichen Vektoren Informationen enthalten Datum Zeit in folgendem Format zu subtrahieren:R Finden Zeitdifferenz in Sekunden für YYYY-MM-DD HH: MM: ss.mmm Format

> 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‘ Gejagt und gespielt mit zoo, as.Date, as.POSIXct usw., um zu versuchen, den richtigen Code zu finden, um 2 Datetime-Objekte zu subtrahieren und eine Antwort in Sekunden zu bekommen, aber ohne Glück.

Ich würde mich über Vorschläge freuen.

Antwort

12

Kinderleicht:

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> 

Und für Ihre Daten:

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> 

und hinzugefügt als numerischer an den Datenrahmen zurück:

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

Ihnen sehr danken. Ich hätte das nie alleine bekommen. Datum-Zeit-Zeug ist ein "bekanntes Unbekanntes" für mich (von Don Rumsfeld zu leihen). – screechOwl

+11

Es kann sich herausstellen, dass Sie die Zeitdifferenz mit 'difftime (dann, jetzt, units =" secs ")' oder 'difftime (dann, jetzt, units =" mins ") als eine bestimmte Zeiteinheit erzwingen können. 'etc ... Siehe'? difftime' – thelatemail

+0

@ screechOwl: Wie bei vielen Dingen R, braucht es manchmal ein paar Kopfscheuern und Stirnschlagen, aber es ist sehr, sehr kraftvoll. Definitiv wert zu lernen. –

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" 

ich gefolgt Antwort von @Dirk Eddelbüttel, aber ich bin losi ng Präzision. Wie kann ich R zwingen, Teile von Sekunde nicht zu schneiden?

Glück (Mann von strptime) antwortete ich meine Frage mich:

op <- options(digits.secs = 3) 

Nach der Anwendung dieses die Präzision Einstellung verwendet.

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

Die belowe nützlich sein kann, wenn Sie Unterschied in Sekunden erhalten mögen, aber in wenigen Minuten erhalten:

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