Преобразование эпохи UNIX в объект Date

118

Я строю и выполняю вычисления на равномерно распределенных временных рядах. Отметки времени в настоящее время хранятся как целые числа, представляющие количество секунд с эпохи UNIX (например 1352068320), но Dateобъекты кажутся более подходящими для построения графиков. Как я могу сделать преобразование?

Я прочитал ?Date, ?as.Dateи ??epoch, но , похоже, пропустил эту информацию.

Andreas
источник

Ответы:

220

Пройдите через, POSIXctи вы хотите установить TZтам - здесь вы видите мое (Чикаго) по умолчанию:

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> 

Изменить: несколько лет спустя мы теперь можем использовать пакет в любое время :

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

Обратите внимание, как все это работает без аргументов формата или происхождения .

Дирк Эддельбюттель
источник
10
У меня есть отметки времени вроде 1415560016876. epochconverter.com без проблем преобразует это в дату. Ваш код выше дает мне что-то вроде "46832-11-09 12:47:33 EDT"...
Hack-R
29
Попробуйте разделить это на 1000: as.POSIXct(1415560016876/1000, origin="1970-01-01")получите «2014-11-09 13: 06: 56.875 CST», и вам нужно убедиться, что ожидаются секунды (как для R) или миллисекунды .
Дирк Эддельбюттель
2
@Shambho: Просто сделайте обратное и посмотрите, находитесь ли вы в том же порядке:print(as.numeric(Sys.time()))
Дирк Эддельбюттель
2
Это всегда одно и то же: масштабируйте то, что у вас есть, чтобы оно было в том же масштабе, что и текущее время: print(as.numeric(Sys.time()), digits=16)с шестью цифрами - это то, что моя система Linux. Кроме того, вы можете разделить на 1000; это не усекает.
Дирк Эддельбюттель
1
Как бы вы извлекли только местное время из переменной R и сбросили дату?
Stratix
17

В library(lubridate), числовые представления даты и времени, сохраненные как количество секунд с 1970-01-01 00:00:00 UTC, могут быть объединены в даты с помощью as_datetime():

lubridate::as_datetime(1352068320)

[1] "2012-11-04 22:32:00 UTC"
Юрий Барвинченко
источник