Как извлечь правильные часовые пояса из объектов POSIXct и POSIXlt? - PullRequest
17 голосов
/ 20 мая 2011
time1 = as.POSIXlt("2010-07-01 16:00:00", tz="Europe/London")
time1
# [1] "2010-07-01 16:00:00 Europe/London"

но

time2 = as.POSIXct("2010-07-01 16:00:00", tz="Europe/London")
time2
# [1] "2010-07-01 16:00:00 BST"

Почему часовой пояс представлен по-другому?Это важно для меня, потому что мне нужно извлечь часовые пояса из моей даты.

base::format(time1, format="%Z")
# [1] "BST"
base::format(time2, format="%Z")
# [1] "BST"

оба дают одинаковое "BST" для британского времени экономии!

Проблема в том, что "BSTmsgstr "не удается распознать формат POSIXct / POSIXlt:

as.POSIXlt("2010-07-01 16:00:00", tz="BST")
# [1] "2010-07-01 16:00:00 BST"
# Warning messages:
# 1: In strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
#   unknown timezone 'BST'
# 2: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
#   unknown timezone 'BST'
# 3: In strptime(x, f, tz = tz) : unknown timezone 'BST'
as.POSIXct("2010-07-01 16:00:00", tz="BST")
# [1] "2010-07-01 16:00:00 GMT"
# Warning messages:
# 1: In strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) :
#   unknown timezone 'BST'
# 2: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
#   unknown timezone 'BST'
# 3: In strptime(x, f, tz = tz) : unknown timezone 'BST'
# 4: In structure(xx, class = c("POSIXct", "POSIXt"), tzone = tz) :
#   unknown timezone 'BST'
# 5: In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'BST'

Я действительно запутался.У меня есть 2 вопроса:

1 / В чем разница между форматами POSIXct и POSIXlt

2 / Кто-нибудь знает, какой часовой пояс я могу использовать?

"Европа / Лондон" работает с POSIXlt, но не с POSIXct.Кроме того, его нельзя извлечь из времени с использованием base :: format
"BST" не распознается как действительный часовой пояс в функциях as.POSIXct или as.POSIXlt.

Ответы [ 3 ]

14 голосов
/ 20 мая 2011

@ Кошке уже показал

  • разницу во внутреннем представлении обоих типов дат и
  • , что внутренне обе спецификации часовых поясов одинаковы.

Вы можете стандартизировать часовой пояс, используя attr().Будет получен часовой пояс в форме, указанной в файле zone.tab, который используется R для определения часовых поясов (Подробнее в ?timezones).

например:

> attr(time1,"tzone")
[1] "Europe/London"
> attr(time2,"tzone")
[1] "Europe/London"

Я весьма удивлен тем, что POSIXct использует разные индикаторы для часовых поясов, чем POSIXlt, тогда как атрибуты равны.По-видимому, этот «BST» появляется только при печати POSIXct.Перед печатью POSIXct снова преобразуется в POSIXlt, а атрибут tzone корректируется с помощью синонимов:

> attr(as.POSIXlt(time2),"tzone")
[1] "Europe/london" "GMT"           "BST"   

Это происходит где-то ниже внутренней внутренней R функции as.POSIXlt, котораяЯ не могу смотреть на данный момент из-за более острых проблем, которые нужно решить.Но не стесняйтесь пройти через это и посмотреть, что именно там происходит.

В sidenote "BST" не распознается как часовой пояс (и он также не упоминается в zone.tab) в моей установке Windows 7 / R 2.13.0.

7 голосов
/ 20 мая 2011

возможно, unclass Обнаружение объектов поможет вам проверить различия:

> unclass(time1)
$sec
[1] 0

$min
[1] 0

... snip

$yday
[1] 181

$isdst
[1] 1

attr(,"tzone")
[1] "Europe/London"

> unclass(time2)
[1] 1277996400
attr(,"tzone")
[1] "Europe/London"

таким образом, POSIXlt содержит дату в виде списка компонентов, в то время как POSIXct содержит ее в виде числа, т. Е. Время эпохи UNIX.

Что касается часового пояса, то он выходит за рамки R.
См. Объяснение в http://en.wikipedia.org/wiki/Tz_database

Что касается различного поведения

as.POSIXct("2010-07-01 16:00:00", tz="BST")
as.POSIXlt("2010-07-01 16:00:00", tz="BST")

Я подозреваю, что в as.POSIXct есть ошибка, которая не обрабатывает аргумент tz.

0 голосов
/ 27 октября 2012

1 / В чем разница между форматами POSIXct и POSIXlt

  • POSIXct - секунды с эпохи
  • POSIXlt разбивает дату и время на %Y-%m-%d или %Y/%m/%d %H:%M:%S или другие подобные форматы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...