Неожиданное поведение .POSIXct и strptime вокруг DST - PullRequest
0 голосов
/ 24 декабря 2018

Я испытываю странное поведение с as.POSIXct().У меня есть данные, собранные в этом году, и я пытаюсь разобраться с изменением летнего времени 4 ноября.Я в CST6CDT или "America/Chicago".Мои данные даты - это символьный вектор, который выглядит следующим образом:

"11/04/2018 1:59 AM"
"11/04/2018 2:00 AM"
"11/04/2018 2:01 AM"
...
"11/11/2018 3:52 PM"
"11/11/2018 2:55 PM"

Я настроил свой регистратор данных на запись данных в формате UTC, думая, что позже я спасу себя от DST.К сожалению, компьютер, который я использую для загрузки данных, имеет время, установленное на "America/Chicago", поэтому, когда он подключился к моему регистратору данных, он переключил время назад на час (отсюда переход с 15:52 до 14:55).

Итак, я исправил проблему с датой, чтобы она выглядела следующим образом:

"11/04/2018 1:59 AM"
"11/04/2018 1:00 AM"
"11/04/2018 1:01 AM"
...
"11/11/2018 2:52 PM"
"11/11/2018 2:55 PM"

Однако, когда я использую as.POSIXct(), чтобы изменить эти даты, это происходит странным образом.Например,

as.POSIXct("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p",tz='CST6CDT')
"2018-11-04 01:30:00 CDT" 
as.POSIXct("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p",tz='CST6CDT') 
"2018-11-04 01:31:00 CST"

Я полагаю, хорошо, позвольте мне указать системную спецификацию tz

as.POSIXct("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:30:00 CDT"
as.POSIXct("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p",tz=Sys.timezone())
"2018-11-04 01:31:00 CST"

Может быть, мне нужно явно сообщить системе, что 2 последовательных времени были в CDT

as.POSIXct("11/04/2018 1:30 AM CDT","%m/%d/%Y %I:%M %p",tz=Sys.timezone()) 
"2018-11-04 01:30:00 CDT"
as.POSIXct("11/04/2018 1:31 AM CDT","%m/%d/%Y %I:%M %p",tz=Sys.timezone()) 
"2018-11-04 01:31:00 CST"

А теперь я просто растерялся.Я думал, что as.POSIXct() автоматически распознает летнее время и, следовательно, будет знать, что в "America/Chicago" летнее время наблюдалось 4 ноября, переходя от CDT к CST в 2:00.Эта проблема также возникает в strptime:

strptime("11/04/2018 1:30 AM","%m/%d/%Y %I:%M %p")
"2018-11-04 01:30:00 CDT"
strptime("11/04/2018 1:31 AM","%m/%d/%Y %I:%M %p")
"2018-11-04 01:31:00 CST"

Это происходит как в версии R, которую я использовал: R version 3.4.2 (2017-09-28) -- "Short Summer", так и в самой новой версии R: R version 3.5.1 (2018-07-02) -- "Feather Spray", и происходит как в 32и 64-битные версии.

Однако seq.POSIXt(from=as.POSIXct("11/04/2018 1:00 AM","%m/%d/%Y %I:%M %p", tz=Sys.timezone()), length.out=61, by='1 mins') выдает ожидаемое:

 [1] "2018-11-04 01:00:00 CDT" "2018-11-04 01:01:00 CDT"
 [3] "2018-11-04 01:02:00 CDT" "2018-11-04 01:03:00 CDT"
 ...
[31] "2018-11-04 01:30:00 CDT" "2018-11-04 01:31:00 CDT"
...
[59] "2018-11-04 01:58:00 CDT" "2018-11-04 01:59:00 CDT"
[61] "2018-11-04 01:00:00 CST"

tl / dr: DST вызывает у меня проблемы, потому что as.POSIXct () действует таким образом,это неожиданноЯ рассматривал эту проблему в течение нескольких дней и не могу понять, поэтому любая помощь будет принята с благодарностью.

...