Я испытываю странное поведение с 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 () действует таким образом,это неожиданноЯ рассматривал эту проблему в течение нескольких дней и не могу понять, поэтому любая помощь будет принята с благодарностью.