Konwertuj epokę UNIX na obiekt Date

118

Planuję i wykonuję obliczenia na równomiernie rozłożonych szeregach czasowych. Znaczniki czasu są obecnie przechowywane jako liczby całkowite reprezentujące liczbę sekund od epoki UNIX (np. 1352068320), Ale Dateobiekty wydają się bardziej odpowiednie do kreślenia. Jak mogę dokonać konwersji?

Czytałem ?Date, ?as.Datei ??epoch, ale wydaje się, że brakowało tych informacji.

Andreas
źródło

Odpowiedzi:

220

Przejdź przez POSIXcti chcesz ustawić TZtam - tutaj widzisz moje (Chicago) domyślne:

R> val <- 1352068320
R> as.POSIXct(val, origin="1970-01-01")
[1] "2012-11-04 22:32:00 CST"
R> as.Date(as.POSIXct(val, origin="1970-01-01"))
[1] "2012-11-05" 
R> 

Edycja: kilka lat później możemy teraz korzystać z pakietu w dowolnym momencie :

R> library(anytime)
R> anytime(1352068320)
[1] "2012-11-04 16:32:00 CST"
R> anydate(1352068320)
[1] "2012-11-04"
R> 

Zwróć uwagę, jak to wszystko działa bez żadnych argumentów formatu ani pochodzenia .

Dirk Eddelbuettel
źródło
10
Mam takie znaczniki czasu jak 1415560016876. epochconverter.com bez problemu konwertuje to na datę. Twój kod powyżej daje mi takie rzeczy jak "46832-11-09 12:47:33 EDT"...
Hack-R
29
Spróbuj podzielić to przez 1000: as.POSIXct(1415560016876/1000, origin="1970-01-01")pobiera „2014-11-09 13: 06: 56.875 CST” i upewnij się, czy są oczekiwane sekundy (jak w przypadku R), czy milisekundy .
Dirk Eddelbuettel
2
@Shambho: Po prostu zrób w odwrotnej kolejności i zobacz, czy jesteś w tym samym rzędzie wielkości:print(as.numeric(Sys.time()))
Dirk Eddelbuettel,
2
Zawsze jest to samo: skaluj to, co masz, aby dochodzić do tej samej skali, co obecny czas: print(as.numeric(Sys.time()), digits=16)z sześcioma cyframi jest to, co mój system Linux. Możesz również podzielić przez 1000; to nie ucina.
Dirk Eddelbuettel
1
Jak wyodrębniłbyś tylko czas lokalny ze zmiennej R i zrzucił datę?
Stratix
17

W programie library(lubridate)liczbowe reprezentacje daty i czasu zapisane jako liczba sekund od 1970-01-01 00:00:00 czasu UTC, można powiązać z datami za pomocą as_datetime():

lubridate::as_datetime(1352068320)

[1] "2012-11-04 22:32:00 UTC"
Yuriy Barvinchenko
źródło