Странное поведение с lubridate: добавление указанного c количества дней к указанной c дате дает NA - PullRequest
2 голосов
/ 27 мая 2020

Я использую lubridate для выполнения нескольких операций с датами, и в какой-то момент мне нужно добавить 6 дней к дате, с которой я работаю. Я делаю это в al oop, и это работает почти для каждой даты, но для этого c one сумма возвращает NA

library(lubridate)
testDate <- ymd("2018-10-29", tz = "America/Sao_Paulo")

testDate + days(4) #OK
testDate + days(5) #OK
testDate + days(6) #Returns NA
testDate + days(7) #OK
testDate + days(8) #OK
testDate + days(9) #OK

Может кто-нибудь помочь мне понять, почему это происходит ?

Информация о сеансе:

R version 3.6.0 (2019-04-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

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

other attached packages:
[1] lubridate_1.7.4

loaded via a namespace (and not attached):
[1] compiler_3.6.0 magrittr_1.5   tools_3.6.0    Rcpp_1.0.3     stringi_1.4.3  stringr_1.4.0 

1 Ответ

3 голосов
/ 27 мая 2020

Как предположил @akrun, это проблема перехода на летнее время. Глядя на дни до и после 6:

format(testDate + days(c(5,7)), format = "%Y-%m-%d %H:%M:%S")
# [1] "2018-11-03 00:00:00" "2018-11-05 00:00:00"

, вы заметите, что это означает «полночь» (как и следовало ожидать).

В Сан-Паулу, Бразилия, в 2018 г. он откатился в полночь 4-го ( ref ) в полночь:

Когда местное стандартное время приближалось к воскресенью, 4 ноября 2018 г., 12 : 00:00 полночь часы были переведены вперед 1 час до воскресенья, 4 ноября 2018 г., 1: 00:00 местное летнее время.

Это означает, что 3 ноября, 23:59:59, существовало, но как только он прошел на секунду вперед, стало 4 ноября, 01:00:00. Это предполагает, что (математически) 3 ноября 00:00:00 никогда не существовало.

Из-за этого R сообщает вам, что метка времени не является допустимым временем, возвращая NA.

Однако вы можете довольно легко справиться с Date объектами:

testDate + days(5:7)
# [1] "2018-11-03 -03" NA               "2018-11-05 -02"

as.Date(testDate) + days(5:7)
# [1] "2018-11-03" "2018-11-04" "2018-11-05"
...