R не всегда преобразовывает время вокруг изменения летнего времени - PullRequest
0 голосов
/ 07 декабря 2018

Использование R на Windows Machine

as.POSIXct('2018-11-04 01:30:00', tz = 'America/Chicago')
# "2018-11-04 01:30:00 CDT"

as.POSIXct('2018-11-04 01:40:00', tz = 'America/Chicago')
# "2018-11-04 01:40:00 CST"

Я понимаю, что эти времена неоднозначны (технически могут быть CDT или CST) и могут быть трудными для интерпретации R.Однако случайность этих результатов затрудняет преобразование времен за эти периоды.Есть ли способ обойти это, что позволяет получить более последовательные результаты?

1 Ответ

0 голосов
/ 07 декабря 2018

Если вы посмотрите на целочисленное представление, то заметите:

# divide by 60 to convert to minutes from seconds
as.integer(as.POSIXct('2018-11-04 01:30:00', tz = 'America/Chicago'))/60
# [1] 25688550

as.integer(as.POSIXct('2018-11-04 01:40:00', tz = 'America/Chicago'))/60
# [1] 25688620

Это интервал в 70 минут, то есть последний соответствует тому, что было бы 2:40, если бы CDT продолжался;это кажется довольно последовательным для меняМне не удалось найти какой-либо справки по быстрому поиску, чтобы узнать, какие именно сведения о переключении летнего времени для America/Chicago часового пояса, в частности.

Кроме того, вы можете рассмотреть представление POSIXlt в этомcase:

dput(as.POSIXlt('2018-11-04 01:30:00', tz = 'America/Chicago'))
# structure(list(sec = 0, min = 30L, hour = 1L, mday = 4L, mon = 10L, 
#     year = 118L, wday = 0L, yday = 307L, isdst = 1L, zone = "CDT", 
#     gmtoff = NA_integer_), class = c("POSIXlt", "POSIXt"), tzone = "America/Chicago")

dput(as.POSIXlt('2018-11-04 01:40:00', tz = 'America/Chicago'))
# structure(list(sec = 0, min = 40L, hour = 1L, mday = 4L, mon = 10L, 
#     year = 118L, wday = 0L, yday = 307L, isdst = 0L, zone = "CST", 
#     gmtoff = NA_integer_), class = c("POSIXlt", "POSIXt"), tzone = "America/Chicago")

Обратите внимание на разницу в isdst между двумя объектами ...

Чтобы продолжить, нам действительно нужно отыскать авторитетный источник о том, как CDT / CSTразграничены.Но FWIW, точное время переключения выглядит как 1:30:05:

as.POSIXct('2018-11-04 01:30:05', tz = 'America/Chicago')
# [1] "2018-11-04 01:30:05 CDT"

as.POSIXct('2018-11-04 01:30:06', tz = 'America/Chicago')
# [1] "2018-11-04 01:30:06 CST"

(чтобы понять это, я посмотрел на вывод:)

with(expand.grid(second = 0:59, minute = 30:40),
     as.POSIXct(sprintf('2018-11-04 01:%02d:%02d', minute, second),
                tz = 'America/Chicago'))
...