as.POSIXct, часть часового пояса игнорируется - PullRequest
1 голос
/ 15 апреля 2020

Вот мой пример.

test <- as.POSIXct(as.Date("2019-11-01"), tz = "UTC")
test

Он печатает:

[1] "2019-10-31 19:00:00 CDT"

Похоже, что игнорируется tz параметр:

attr(test, "tzone")

возвращает NULL.

Почему он идет с "19" часами, а не с 00? Как я могу сделать это за 00 часов и взять UTC?

ОБНОВЛЕНИЕ Вот еще лучший вариант:

test_2 <- as.POSIXct("2019-11-01 00:00:00", tz = "UTC")
str(test_2)
attr(test_2, "tzone")
strftime(test_2, "%H")

Он генерирует:

POSIXct[1:1], format: "2019-11-01"
[1] "UTC"
[1] "19"

Теперь это выглядит как параметр tz не игнорируется, но час 19, но почему?

1 Ответ

1 голос
/ 15 апреля 2020

Мы можем использовать with_tz из lubridate

library(lubridate)
test1 <- with_tz(as.Date("2019-11-01"), tzone = 'UTC')
attr(test1, 'tzone')
#[1] "UTC"

Кроме того, as.POSIXct может применяться непосредственно

test2 <- as.POSIXct("2019-11-01", tz = "UTC")
test2
#[1] "2019-11-01 UTC"
attr(test2, 'tzone')
#[1] "UTC"

С strftime используйте опцию для tz

strftime(test2, "%H", tz = 'UTC')
#[1] "00"

Если мы проверим strftime, он выполняет второе преобразование с as.POSIXlt, а затем с format получает форматированный вывод

strftime
function (x, format = "", tz = "", usetz = FALSE, ...) 
format(as.POSIXlt(x, tz = tz), format = format, usetz = usetz, 
    ...)

Согласно ?as.POSIXlt

tz - спецификация часового пояса, которая будет использоваться для преобразования, если оно требуется. Специфицируется системой c (см. Часовые пояса), но "" - это текущий часовой пояс, а "GMT" - это UT C (Всемирное время, скоординированное). Недопустимые значения чаще всего рассматриваются как UT C, на некоторых платформах с предупреждением.

as.POSIXlt(test2)$hour
#[1] 0
as.POSIXlt(test2, tz = "")$hour
#[1] 20

"" использует Sys.timezone по умолчанию

as.POSIXlt(test2, tz = Sys.timezone())$hour
#[1] 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...