2012-09-26 12 views
9

Próbuję odjąć 2 wektorów znaków zawierających informacje o czasie data w następującym formacie:R Znajdź różnicę czasu w sekundach dla YYYY-MM-DD 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 ve polował i grał z zoo, as.Date, as.POSIXct, itp., aby spróbować znaleźć odpowiedni kod do odjęcia 2 obiektów datetime i uzyskać odpowiedź w kilka sekund, ale bez powodzenia.

Byłbym wdzięczny za wszelkie sugestie.

Odpowiedz

12

Łatwy 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> 

A dla danych:

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> 

i ponownie dodany jako numerycznych ramki danych:

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

Dziękuję bardzo. Nigdy bym tego nie zrobił na własną rękę. Materiały z czasopisma są dla mnie "nieznanym" (pożyczyć od Dona Rumsfelda). – screechOwl

+11

Warto zauważyć, że można wymusić różnicę czasu jako określoną jednostkę czasu za pomocą 'difftime (wtedy, teraz, jednostki =" secs ")' lub 'difftime (wtedy, teraz, jednostki =" min ") 'etc ... Zobacz'? difftime' – thelatemail

+0

@screechOwl: Podobnie jak w przypadku wielu rzeczy R, czasami trzeba trochę drapać głową i czoło, ale jest bardzo, bardzo potężny. Zdecydowanie warto się uczyć. –

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" 

śledziłem odpowiedź @Dirk Eddelbuettel, ale jestem Losi z dokładnością. Jak mogę zmusić R, aby nie odcinał części sekundy?

szczęście (człowiekiem strptime) I odpowiedział na moje pytanie sobie:

op <- options(digits.secs = 3) 

Po zastosowaniu tego ustawienia dokładności zostaną wykorzystane.

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

belowe może być przydatna, jeśli chcesz uzyskać różnicę w sekundach, ale dostać w minutach:

> as.numeric(x2-x1,units="secs") 
[1] 306.776 
Powiązane problemy