Convertir une époque UNIX en objet Date

118

Je trace et effectue des calculs sur des séries chronologiques uniformément distribuées. Les horodatages sont actuellement stockés sous forme d'entiers représentant le nombre de secondes depuis l'époque UNIX (par exemple 1352068320), mais les Dateobjets semblent plus appropriés pour le traçage. Comment puis-je effectuer la conversion?

Je l' ai lu ?Date, ?as.Dateet ??epoch, mais semblent avoir manqué cette information.

Andreas
la source

Réponses:

220

Passez par POSIXctet vous voulez définir un TZlà - vous voyez ici mon (Chicago) par défaut:

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> 

Edit: Quelques années plus tard, nous pouvons désormais utiliser le package à tout moment :

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

Notez comment tout cela fonctionne sans aucun format ni argument d'origine .

Dirk Eddelbuettel
la source
10
J'ai des horodatages comme 1415560016876. epochconverter.com le convertit en une date sans problème. Votre code ci-dessus me donne des trucs comme "46832-11-09 12:47:33 EDT"...
Hack-R
29
Essayez de diviser cela par 1000: as.POSIXct(1415560016876/1000, origin="1970-01-01")obtient "2014-11-09 13: 06: 56.875 CST" et vous devez vous assurer si des secondes sont attendues (comme pour R) ou des millisecondes .
Dirk Eddelbuettel
2
@Shambho: Faites simplement l'inverse et voyez si vous êtes dans le même ordre de grandeur:print(as.numeric(Sys.time()))
Dirk Eddelbuettel
2
C'est toujours la même chose: mettez à l'échelle ce que vous avez pour que cela arrive à la même échelle que l'heure actuelle: print(as.numeric(Sys.time()), digits=16)avec les six chiffres, c'est ce que mon système Linux. En outre, vous pouvez diviser par 1000; cela ne tronque pas.
Dirk Eddelbuettel
1
Comment extraire juste l'heure locale de la variable R et vider la date?
Stratix
17

Dans library(lubridate), les représentations numériques de la date et de l'heure enregistrées sous forme de nombre de secondes depuis le 01/01/1970 à 00:00:00 UTC, peuvent être cohérentes en dates avec as_datetime():

lubridate::as_datetime(1352068320)

[1] "2012-11-04 22:32:00 UTC"
Yuriy Barvinchenko
la source