2013-03-19 13 views
9

Chciałbym obliczyć różnice czasu (czas delta) w R. Znaczniki czasu są przechowywane w ramce danych dwukolumnowej z czasem jako data-godzina (rok-miesiąc-dzień godzina: min: sec.msec), np dla pierwszych trzech wierszy:Różnice między datami w wierszach w R

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 

Chciałbym mieć wyjściowy kolumnę z różnicami np.

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

Czy ktoś może mi powiedzieć, jak to zrobić? Jeśli masz inne/lepsze sugestie, jak zachować wynik, będzie to bardzo doceniane Z góry dziękuję! mishu

+0

'diff (c_time)'? – Ista

+0

Otrzymuję komunikat "nieoczekiwana stała numeryczna" z diff (c_time). W jaki sposób mogę wykonać kolejne różnice we wszystkich wierszach? dzięki! – Mishu

+0

Wklej dane wyjściowe z 'dput (yourdataframe)' do powyższego pytania, abyśmy mogli użyć twoich rzeczywistych danych. –

Odpowiedz

7

Spróbuj tego (Ja zakładając, że masz swoje dane w data.frame zwanego mydf) i że chcesz różnicę między pierwszym znacznikiem czasu i wszystkich kolejnych znaczników czasu:

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] "" 

Edytuj

Ale jeśli chcesz uzyskać różnicę między kolejnymi znacznikami czasu, musisz odwrócić swoje obserwacje (ponieważ pierwszy sposób otrzymasz czas1 - czas2, który będzie ujemny), więc możesz po prostu użyć zamiast niego:

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] "" 
1

Nie dam ci całą odpowiedź, ale to pomoże Ci prawie tam dostać:

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 

Od dni po przecinku można następnie przekształcić go z powrotem do niższej czas Format chcesz, ale w zależności od tego, co chcesz to zrobić, możesz zachować ją w formie liczbowej (być może w godzinach dziesiętnych, przez pomnożenie time_diff przez 24) ...

Powiązane problemy