As.Date(as.POSIXct()) дает неправильную дату?

139
11

Я пытался посмотреть в dataframe, извлекая все строки, где компонент даты столбца POSIXct соответствовал определенному значению. Я наткнулся на следующее, что меня смущает: as.Date(as.POSIXct(...)) не всегда возвращает правильная дата.


> dt <- as.POSIXct('2012-08-06 09:35:23')
[1] "2012-08-06 09:35:23 EST"
> as.Date(dt)
[1] "2012-08-05"

Почему дата '2012-08- 06 09:35:23' равно '2012-08- 05?


Я подозреваю, что это связано с использованием разных временных зон, поэтому, отмечая, что часовой пояс dt был "EST", я дал это as.Date::


> as.Date(as.POSIXct('2012-08-06 09:35:23'), tz='EST')
[1] "2012-08-05"

Но он все равно возвращает 2012-08-05.


Почему это? Как я могу найти все данные в моем фреймворке данных, которые были на дату 2012-08-06? (поскольку subset(my.df, as.character(as.Date(datetime), tz='EST') == '2012-08-06') не возвращает строку с datetime dt, хотя это произошло в дату 2012-08-06...)?


Добавленные сведения: Linux 64bit (хотя может воспроизводить на 32-битной основе), может получить это как на R 3.0.1, так и на 3.0.0, и я сейчас AEST (австралийское восточное стандартное время)

спросил(а) 2021-01-25T18:59:03+03:00 4 месяца, 3 недели назад
1
Решение
146

Документация для часовых поясов тоже меня смущает. В некоторых случаях EST может быть недвусмысленным и может фактически ссылаться на tz в Австралии. Попробуйте "EST5EDT" или "America/New_York".


В этом случае это также может относиться к различиям в том, как ваша неустановленная ОС обрабатывает аргумент "tz", так как я получаю "2012-08-06". (Я нахожусь в PDT US tz на данный момент, хотя я не уверен, что это имеет значение.) Изменение функции, которая получает аргумент tz, может уточнить (или нет):


> as.Date(as.POSIXct('2012-08-06 19:35:23', tz='EST'))
[1] "2012-08-07"
> as.Date(as.POSIXct('2012-08-06 17:35:23', tz='EST'))
[1] "2012-08-06"

> as.Date(as.POSIXct('2012-08-06 21:35:23'), tz='EST')
[1] "2012-08-06"
> as.Date(as.POSIXct('2012-08-06 22:35:23'), tz='EST')
[1] "2012-08-07"

Если вы опускаете tz из as.POSIXct, тогда принимается UTC.


Это недвусмысленные имена Ozzie TZ (по крайней мере, на моем Mac):


tzfile <- "/usr/share/zoneinfo/zone.tab"
tzones <- read.delim(tzfile, row.names = NULL, header = FALSE,
col.names = c("country", "coords", "name", "comments"),
as.is = TRUE, fill = TRUE, comment.char = "#")
grep("^Aus", tzones$name, value=TRUE)
[1] "Australia/Lord_Howe" "Australia/Hobart"
[3] "Australia/Currie" "Australia/Melbourne"
[5] "Australia/Sydney" "Australia/Broken_Hill"
[7] "Australia/Brisbane" "Australia/Lindeman"
[9] "Australia/Adelaide" "Australia/Darwin"
[11] "Australia/Perth" "Australia/Eucla"

ответил(а) 2021-01-25T18:59:03+03:00 4 месяца, 3 недели назад
125

У нас есть австралийский сайт (местоположение в Брисбене, Win7 Enterprise 64 бит, R3.0.1):


Я могу реплицировать вашу проблему:


> dt <- as.POSIXct('2012-08-06 09:35:23')
> dt
[1] "2012-08-06 09:35:23 EST"
> as.Date(dt)
[1] "2012-08-05"

Так как as.Date по умолчанию используется UTC (GMT), как указано в ?as.Date:


## S3 method for class 'POSIXct'
as.Date(x, tz = "UTC", ...)

Принуждение представления POSIXct к UTC затем работает как ожидалось:


> dt <- as.POSIXct('2012-08-06 09:35:23',tz="UTC")
> as.Date(dt)
[1] "2012-08-06"

В качестве альтернативы, совмещение их обоих с моим локальным tz отлично работает:


> dt <- as.POSIXct('2012-08-06 09:35:23',tz="Australia/Brisbane")
> as.Date(dt,tz="Australia/Brisbane")
[1] "2012-08-06"

Изменить: неопределенность с тегом EST кажется для меня проблемой:


Использование по умолчанию as.POSIXct


> dt.def <- as.POSIXct("2012-01-01 22:00:00")
> dt.def
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.def)
[1] 1325419200
>

Неоднозначный EST - должен быть таким же, как и по умолчанию


> dt.est <- as.POSIXct("2012-01-01 22:00:00",tz="EST")
> dt.est
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.est)
[1] 1325473200
>

Однозначный Брисбен, часовой пояс Австралии


> dt.bris <- as.POSIXct("2012-01-01 22:00:00",tz="Australia/Brisbane")
> dt.bris
[1] "2012-01-01 22:00:00 EST"
> as.numeric(dt.bris )
[1] 1325419200
>

Различия


> dt.est - dt.def
Time difference of 15 hours
> dt.est - dt.bris
Time difference of 15 hours
> dt.bris - dt.def
Time difference of 0 secs

ответил(а) 2021-01-25T18:59:03+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема