2015-05-25 21 views
5

Mam następujący data.frame:Konwersja ramka danych ze znaczników czasu epoki do szeregów czasowych z milisekund w R

df <- data.frame(timestamp=c(1428319770511, 1428319797218, 1428319798182, 1428319803327, 1428319808478), 
       session=c("A","A","B","A","A")) 

chciałbym przekształcić tę ramkę danych w szeregach czasowych i czasu pracy na oknach krótszy niż jedna sekunda. Próbowałem już zoo i xts, ale trudno było reprezentować czasy epok jako daty. Oto, co już próbowałem:

df$date<-strptime(as.POSIXct(df$timestamp, origin="1970-01-01"),format="%Y-%m-%d %H:%M:%OS") 

które zwracają NAS. Nazywając to:

df$date<-strptime(as.POSIXct(df$timestamp/1000, origin="1970-01-01"),format="%Y-%m-%d %H:%M:%OS") 

Działa, ale nie zawiera danych milisekund. Próbowałem również grać z options(digits.secs=3), ale bez powodzenia.

Domyślam się, że uderzam w małą ścianę, gdy R zajmuje milisekundy, ale wszelkie pomysły będą mile widziane.

--- EDIT ---

Ok, dzięki za odpowiedź Jozuego i komentarz tutaj Convert UNIX epoch to Date object in R przez @Dirk Eddelbuettel, dzieląc przez 1000 nie obciąć dane. Tak to działa:

options(digits.secs = 3) 
df$date<-as.POSIXct(df$timestamp/1000, origin="1970-01-01", tz="UTC") 

która zwraca:

timestamp  session date  
1428319770511 A  2015-04-06 14:29:30.510 
1428319797218 A  2015-04-06 14:29:57.217 
1428319798182 B  2015-04-06 14:29:58.181 
1428319803327 A  2015-04-06 14:30:03.326 
1428319808478 A  2015-04-06 14:30:08.477 

Odpowiedz

3

Twoje znaczniki czasu są w milisekundach. Musisz przekonwertować je na sekundy, aby móc je używać z as.POSIXct. I nie ma sensu dzwonić pod numer strptime w wektorze POSIXct.

Dobrą praktyką jest jawne ustawienie strefy czasowej, a nie ustawienie jej na "".

df$datetime <- as.POSIXct(df$timestamp/1000, origin="1970-01-01", tz="UTC") 
options(digits.secs=6) 
df 
#  timestamp session    datetime 
# 1 1.42832e+12  A 2015-04-06 11:29:30.510 
# 2 1.42832e+12  A 2015-04-06 11:29:57.217 
# 3 1.42832e+12  B 2015-04-06 11:29:58.181 
# 4 1.42832e+12  A 2015-04-06 11:30:03.326 
# 5 1.42832e+12  A 2015-04-06 11:30:08.477 

Nie jestem pewien, dlaczego nie widzisz rozdzielczości milisekundy ...