2016-05-13 3 views
1

У меня возникли проблемы с пониманием того, как обрабатываются строки времени в R и почему Sys.time() использует другую строку, чем Sys.timezone()?Понимание строк часового пояса в R

Sys.time() возвращается:

[1] "2016-05-13 10:17:04 CEST"

as.POSIXct(Sys.time()) работы:

[1] «2016- 05-13 10:17:11 CEST "

И as.POSIXct("2016-05-1 10:15:21 CEST") работает хорошо:

[1] "2016-05-01 10:15:21 CEST"

Однако as.POSIXct("2016-05-1 10:15:21", tz = "CEST") делает НЕ работы:

[1 ] "2016-05-01 10:15:21 GMT"
Предупреждающие сообщения:
1: В strptime (xx, f < - "% Y-% m-% d% H:% M:% OS", tz = tz): неизвестный часовой пояс 'CEST' 2: В as.POSIXct.POSIXlt (х): неизвестный часовой пояс '' CEST
3: В strptime (X, F, TZ = TZ): Неизвестный часовой пояс '' CEST
4: В as.POSIXct.POSIXlt (as.POSIXlt (х, TZ, ...), TZ, ...): неизвестный часовой пояс 'CEST'
5: В as.POSIXlt.POSIXct (х, TZ): неизвестный часовой пояс 'CEST'

Я знаю, что я могу решить эту проблему с:

Sys.timezone(location = TRUE) 

[1] "Европа/Берлин"

И as.POSIXct("2016-05-1 10:15:21", tz = Sys.timezone(location = TRUE)) возвращается:

[1] "2016-05-01 10:15:21 CEST"

Но я бы как понять, почему это работает так? И предположим, что у меня есть данные из другого часового пояса (например, Нью-Йорк), как я могу узнать, какую строку использовать?

Edit: Ответ на Мэтта и Адамса ссылку дал ответ на второй вопрос: часовые пояса можно посмотреть в Википедии или lubridate::olson.time.zones.

Однако основной вопрос по-прежнему остается без ответа: почему «2016-05-01 10:15:21 CEST» действителен POSIXct class, а as.POSIXct("2016-05-1 10:15:21", tz = "CEST") невозможен.

+2

Я нахожу это очень полезным. https://rstudio-pubs-static.s3.amazonaws.com/28038_1bcb9aa80ca84f27ace07d612872861a.html –

+0

У меня есть хороший опыт работы с lubridate. Возможно, вы ищете [tz] (http://www.inside-r.org/packages/cran/lubridate/docs/tz)? – Christoph

ответ

0

CE S T, вероятно, означает Центральной Европы Летней времени. Так что во время перехода на летнее время, CET становится CEST, а зимой не будет:

as.POSIXct(c("2016-1-1 13:00", "2016-3-1 13:00", 
      "2016-5-1 13:00", "2016-6-1 13:00", 
      "2016-9-1 13:00","2016-11-1 13:00"), tz="CET") 

возвращается:

"2016-01-01 13:00:00 CET" "2016-03-01 13:00:00 CET" "2016-05-01 13:00:00 CEST" 
"2016-06-01 13:00:00 CEST" "2016-09-01 13:00:00 CEST" "2016-11-01 13:00:00 CET" 

Однако, как пояснил @Matt_Johnson, CEST не на официальной часовой пояс,
поэтому as.POSIXct("2016-1-1 13:00, tz="CEST") не работает.

Что остается странным, что CEST является приемлемым в строке, даже если время oustide летнее время:

as.POSIXct("2016-1-1 13:00 CEST") 
[1] "2016-01-01 13:00:00 CET" 

Файлы справки из as.POSIXct и strptime не предлагают объяснений здесь ,

1

Когда-нибудь я хочу, чтобы мир использовал только единый стандарт в единицах измерения, будь то время, длина, температура и т. Д. Но до этого дня эта ссылка из rstudio является одной из лучших записей по работе со временем : https://rstudio-pubs-static.s3.amazonaws.com/28038_1bcb9aa80ca84f27ace07d612872861a.html

в частности к вашему вопросу

library(lubridate) 
x <- as.POSIXct("2016-05-1 10:15:21", tz = "America/New_York") 
with_tz(x, tz="Europe/Berlin") 
[1] "2016-05-01 16:15:21 CEST" 
+0

Спасибо за ссылку, это действительно очень полезно. Он отвечает на мой второй вопрос: как найти строки часового пояса: 'olson_time_zones()' из пакета lubridate. Однако я все еще не понимаю, почему 'as.POSIXct (« 2016-05-1 10:15:21 CEST »)' работает и 'as.POSIXct (« 2016-05-1 10:15:21 », tz =" CEST ")' НЕ. – RHA

1

временные зоны, указанные должны быть те из IANA TZ Database. Вы можете найти a list of all supported time zones here. CEST нет в списке.

В общем, идентификаторы в TZDB состоит из следующих форм:

  • Место зон на основе, в виде Area/Locality, такие как America/Los_Angeles, Europe/Paris, или Pacific/Honolulu.
    • Это наиболее предпочтительный формат, который вы должны использовать, когда это возможно.
    • Некоторые из них имеют более двух частей, таких как America/Indiana/Knox
  • Административные зоны с фиксированными смещениями, такие Etc/UTC, Etc/GMT-3 или Etc/GMT+5.
    • Кроме UTC и GMT, они в основном используются для судов в море. Они почти никогда не нужны на суше.
    • Смещения в этих строках имеют инвертированный знак, по старым причинам.
  • Старые зоны конкретных стран, таких как US/Central, Canada/Atlantic и Egypt.
    • Это должно считаться устаревшим. Раньше они были зонами, но теперь это просто «ссылки» для обратной совместимости.
  • Некоторые из наиболее популярных часовых поясов в стиле POSIX, таких как EST5EDT.
    • Также для обратной совместимости. Не используйте их.
    • Для получения более подробной информации см. Раздел о часовых поясах posix in the timezone tag wiki.
  • Несколько общих сокращений часового пояса, таких как CET и EST.
    • Опять же, не используйте их.
    • См. this list on Wikipedia и обратите внимание на то, что существует много повторяющихся записей, что делает аббревиатуры несколько неоднозначными. Например, CST может быть Центральным стандартным временем в Северной Америке, или оно может принадлежать Кубе, Китаю или Австралии.
    • Несмотря на то, что CEST может показаться неоднозначным, подумайте, что во многих разных часовых поясах IANA используется такое же сокращение, даже если они могут отличаться в какой-то момент своей истории.
+0

Спасибо (+1) за подробный ответ на timezoness. Но это все еще вызывает мое удивление, почему «2016-05-01 10:15:21 CEST» является допустимым «классом POSIXct», а 'as.POSIXct (« 2016-05-1 10:15:21 », tz = CEST ")' не работает. – RHA

+0

Невозможно найти * точную * ссылку, отличную от того, что 'tz' должен быть действительным идентификатором olson, но какие сокращения в другой форме могут быть специфичными для реализации или, возможно, игнорироваться. Или, возможно, они делают грубое соответствие подмножеству аббревиатур или берут их с выходной стороны и просто берут первое, что соответствует. Я не вижу жесткой спецификации в этой конкретной точке. –

+0

Попробуйте другие сокращения и посмотрите, что произойдет. Что он делает с «BST», например? Вы получаете британское летнее время? или Бангладеш стандартное время? –

Смежные вопросы