Почему преобразование часового пояса при переносе даты-времени в вектор в R? [Дубликат]

Если вам нужен sdk 23, добавьте это в свою граду:

android {
    useLibrary 'org.apache.http.legacy'
}
6
задан Ken Williams 5 October 2011 в 19:03
поделиться

3 ответа

Почему бы не настроить часовой пояс на GMT для ваших сеансов R, тогда? Если что-то преобразуется в «текущий» часовой пояс, он по-прежнему прав.

3
ответ дан Brian Diggs 19 August 2018 в 08:18
поделиться
  • 1
    Да, я подумываю об этом. Но это не похоже на то, что я когда-либо работал с данными из одного часового пояса, и мне не нравится это «действие на расстоянии». что моя среда имеет на мои данные. – Ken Williams 5 October 2011 в 20:39
  • 2
    Вы можете просто установить его в соответствующих сеансах (скриптах) из R с помощью Sys.setenv(TZ="GMT") – Brian Diggs 5 October 2011 в 22:40

Это поведение задокументировано в ?c.POSIXct (та же справочная страница, что и ?DateTimeClasses), ?c и ?unlist:

Из ?c.POSIXct:

Используя c на объектах «POSIXlt», они преобразуют их в текущий часовой пояс, а на «POSIXct» объекты опускают любые атрибуты tzone »(даже если все они отмечены тем же часовым поясом) . *

Из ?c:

c иногда используется для его побочного эффекта удаления атрибутов, кроме имен. *

< / blockquote>

Тем не менее, мое тестирование показывает, что целостность ваших данных остается неизменной, несмотря на использование c или unlist. Например:

x <- structure(1317830532, class = c("POSIXct", "POSIXt"), 
                 tzone = "GMT")
y <- structure(1317830532+3600, class = c("POSIXct", "POSIXt"), 
                 tzone = "PST8PDT")
x
[1] "2011-10-05 16:02:12 GMT"

y
[1] "2011-10-05 10:02:12 PDT"

strftime(c(x, y), format="%Y/%m/%d %H:%M:%S", tz="GMT")
[1] "2011/10/05 16:02:12" "2011/10/05 17:02:12"

strftime(c(x, y), format="%Y/%m/%d %H:%M:%S", tz="PST8PDT")
[1] "2011/10/05 09:02:12" "2011/10/05 10:02:12"

strftime(unlist(y), format="%Y/%m/%d %H:%M:%S", tz="PST8PDT")
[1] "2011/10/05 10:02:12"

Ваш Марсовод должен быть в порядке, если вы используете R для отслеживания дат.

5
ответ дан Henrik 19 August 2018 в 08:18
поделиться
  • 1
    Я думаю, что мой ровер находится под угрозой, потому что я смотрю на такие вещи, как время дня, когда события происходили (например, x-floor_date(x,'day')), и если временные зоны молча удалены, эти числа ошибочны. – Ken Williams 5 October 2011 в 20:35
  • 2
    Еще один пример: strftime(unlist(list(y)), format="%Y/%m/%d %H:%M:%S", tz="PST8PDT") Ошибка в as.POSIXlt.numeric (x, tz = tz): «источник» должен быть поставлен – Ken Williams 5 October 2011 в 20:41
  • 3
    Короче говоря, я понимаю, что это документированное поведение, я просто думаю, что это чрезвычайно склонный к ошибкам и вряд ли действительно поможет. Если я хочу конвертировать в локальное время, я бы просто не позвонил c(), я бы сделал код более явным. – Ken Williams 5 October 2011 в 20:44
  • 4
    @KenWilliams Мое понимание не в том, что c преобразует время в локальное время. Да, он удаляет оригинал tz, но фактическое время остается неизменным. Случается, что неявное преобразование в локальное время происходит в ваших последующих вычислениях. Я вижу, как это приведет к проблеме бухгалтерского учета, если вы позже захотите узнать, что такое местное время, и у вас больше нет записи о tz. Извините, но не могу придумать, как легко это исправить. – Andrie 6 October 2011 в 15:08
  • 5
    Правильно - точнее, c удаляет любой атрибут часового пояса, а затем различные другие функции будут выбирать часовой пояс по умолчанию на основе моей среды. Точка относительно GMT остается неизменной, но время дня меняется. – Ken Williams 7 November 2011 в 17:42

Учитывая, что это задокументированное поведение, и нужно либо избегать таких функций, либо защищать его таким образом, чтобы защитить любой подход. Для таких вещей я бы рекомендовал написать «бедный человек»; с таким детектором lint, вы можете пойти о восстановлении здравомыслия. Кроме того, для обнаружения ворса существует несколько подходов к предотвращению сбоев в полярных орбитах Марса, некоторые из них независимы друг от друга, другие зависят:

  1. Установите политику & amp; строить альтернативы. Во-первых, для всех функций, которые, как вы знаете, вызывают проблемы, либо решите, что вы их не будете использовать, либо напишите новую функцию-оболочку, которая будет вести себя так, как предполагалось, и установит желаемый вами параметр часового пояса. Затем убедитесь, что вы используете эту специальную оболочку, а не базовую функцию.
  2. Статический анализ Напишите функцию поиска, используя ваш любимый редактор (например, как макрос), используя сценарий оболочки и amp; функции GNU find и grep или каким-либо другим способом (например, grep в R), чтобы найти те конкретные функции, которые вызывают проблемы. Когда обнаружено, удалите или используйте защитный метод кодирования (например, обертка в # 1).
  3. Тестирование Использование модульных тестов, например. Runit или testthat, разработайте тесты, которые гарантируют сохранение свойств часового пояса при использовании ваших функций или пакета. Каждый раз, когда появляется новая ошибка, создайте новый тест, чтобы убедиться, что ошибка не появляется снова в выпущенных версиях.
  4. Проверка слабых типов. Вы также можете включать тесты на протяжении всего кода, которые проверяют, указан ли часовой пояс. Лучше иметь собственную функцию для этого теста, а не писать блок кода, который воспроизводится повсюду. Таким образом, вы можете в конечном итоге расширить проверку, включив другие типы проверок, такие как сохранение часового пояса и тесты на то, работают ли операции над двумя или несколькими объектами разницы во временных часах (возможно, они позволяют это, возможно, они не ).
  5. Отметить все на один TZ. Также известен как Indiana-be-damned . Сохранение различных политик в отношении часовых поясов - это тяжелая работа и, по существу, является трением в работе с временными данными. Просто перейдите к одному TZ (UTC), а затем отпустите что-нибудь из местного. Если у вас локальная регулярность, которая является инвариантной для DST, тогда обращайтесь к ней после преобразования из UTC.

Я делаю все # 1-4 для других вопросов, но, так же, как они легко адаптируются к проверке часового пояса, они довольно многократно используются для многих задач Орбита Марса. Я делаю именно это, чтобы избежать кодирования следующего такого Орбита Марса. (Это был дорогой урок для всех нас, работающих с числовыми данными.:))

2
ответ дан Iterator 19 August 2018 в 08:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: