Возможная ошибка в as.POSIXct - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю с данными времени и преобразую их в класс POSIXct (читается как строки).Когда я делаю это, он работает со всеми моими данными, но не с одной конкретной строкой.То, что я делаю, по сути:

Time1 <- '1900-04-01' # First Year then Month then Day
Time1_convert <- as.POSIXct( Time1, format='%Y-%m-%d')

Я делаю это векторизованно, и все мои данные хорошо конвертируются.Но с датой 1920-05-01

Time1 <- '1920-05-01' 
Time1_convert <- as.POSIXct( Time1, format='%Y-%m-%d' )

это возвращение NA.Я понятия не имею, почему это происходит.Если я добавлю в as.POSIXct функцию tz = 'GMT';время хорошо конвертировать для всех значений.Что я не понимаю, так это то, почему это происходит и почему это происходит с этим конкретным значением, когда я пытался использовать более 1500 различных значений времени.

Я добавляю изображение вывода: Output in RStudio

Добавлен дополнительный код:

for( m in c(01,02,03,04,05,06,07,08,09,10,11,12)){ 
   print(as.POSIXct(paste0('1920-',m,'-01'),format='%Y-%m-%d'))
}

и вывод:

[1] "1920-01-01 CMT"
[1] "1920-02-01 CMT"
[1] "1920-03-01 CMT"
[1] "1920-04-01 CMT"
[1] NA
[1] "1920-06-01 -04"
[1] "1920-07-01 -04"
[1] "1920-08-01 -04"
[1] "1920-09-01 -04"
[1] "1920-10-01 -04"
[1] "1920-11-01 -04"
[1] "1920-12-01 -04"

Вывод sessionInfo ():

R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

locale:
 [1] LC_CTYPE=es_AR.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=es_AR.UTF-8        LC_COLLATE=es_AR.UTF-8    
 [5] LC_MONETARY=es_AR.UTF-8    LC_MESSAGES=es_AR.UTF-8   
 [7] LC_PAPER=es_AR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_AR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] tools_3.3.3

1 Ответ

0 голосов
/ 17 ноября 2018

Ваши локальные настройки основаны на Аргентине. Как это случилось, Аргентина сбросила свой часовой пояс в эту дату с UTC-4: 16: 48 до UTC-4. Я думаю, это означает, что в Аргентине 5 мая 1920 года не было полуночи. Когда вы конвертируете эту строку в POSIXct, она интерпретирует ее в полночь того дня в вашем местном часовом поясе, что по совпадению время, которое не существовало в Аргентине. (Это объясняет, почему это не было воспроизведено для других, кто попробовал тот же код.)

http://www.statoids.com/tar.html

Места в Аргентине наблюдали местное среднее время до 1894-10-31 00:00. (как измерено после перехода). В этот момент вся страна синхронизировано по местному среднему времени Кордовы, которое было UTC-4: 16: 48. следующий переход произошел в 1920-05-01 00:00, когда были установлены часы впереди шестнадцать минут и сорок восемь секунд, чтобы быть четным UTC-4. Аргентина оставалась единой на UTC-4 до первого перехода на летнее время время было открыто в 1931 году.

Если вам нужен объект POSIXct, вы можете подумать:

а) указание другого часового пояса, в котором в тот день существовала полночь.

as.POSIXct("1920-05-01", tz = "UTC") 
# Or perhaps other nearby time zones didn't have that specific problem?

b) Хранение времени в компонентах, включая одно для даты и одно для времени в течение дня. например time = hour(Time1) + minute(Time1)/60. Это немного громоздко, но может быть возможно выполнить вычисления даты / времени, которые вам нужны.

...