R 从今天的日期减去 1 个月得到 NA
R subtracting 1 month from today's date gives NA
我有一个脚本,其中我根据一些设定的时间段对我的数据进行子集化,并希望对上个月发生的所有记录进行子集化。
但是,如果我尝试从今天的日期减去一个月,它会产生 NA:
> today <- Sys.Date()
> today
[1] "2017-03-29"
> today - months(1)
[1] NA
我确实加载了 lubridate,但我认为此计算是使用基础 R 执行的。如果我减去 2 个月或更多个月,它工作正常:
> today - months(2)
[1] "2017-01-29"
> today - months(3)
[1] "2016-12-29"
有人对可能发生的事情有任何想法吗?
更新:我认为这与不处理闰年情况的简单日期减法有关(2017 年不是闰年,因此 "2017-02-29"
不存在)。
有没有考虑闰年的其他包/函数?对于上面的示例,我希望答案恢复到上个月的最后一天,即:
today - months(1)
# Should yield:
"2017-02-28"
今天和昨天的计算结果相同(或者 ISO 对此的约定是什么)有意义吗?
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] xlsx_0.5.7 xlsxjars_0.6.1 rJava_0.9-8 MRAtools_0.6.8 stringdist_0.9.4.4 stringr_1.2.0
[7] stringi_1.1.3 lubridate_1.6.0 data.table_1.10.4 PKI_0.1-3 base64enc_0.1-3 digest_0.6.12
[13] getPass_0.1-1 RPostgreSQL_0.5-1 DBI_0.5-1
loaded via a namespace (and not attached):
[1] magrittr_1.5 rstudioapi_0.6 tools_3.3.2 parallel_3.3.2
一个月前在此上下文中未定义。 2月29日只存在于闰年
Note: Arithmetic with periods can results in undefined behavior when non-existent dates are involved (such as February 29th in non-leap years). Please see Period-class for more details and %m+% and add_with_rollback for alternative operations.
lubridate
包可以处理你正在做的事情,但你需要使用%m+%
来执行操作。
月份的计算确实是由基数 R 执行的,但不是你想的那样。 Months 用于获取日期对象的月份。
#Example
today <- Sys.Date()
months(today)
[1] "March"
要添加或减去月份,您应该使用 %m+%
from lubridate
:
today <- Sys.Date()
today %m+% months(-1)
[1] "2017-02-28"
我有一个脚本,其中我根据一些设定的时间段对我的数据进行子集化,并希望对上个月发生的所有记录进行子集化。
但是,如果我尝试从今天的日期减去一个月,它会产生 NA:
> today <- Sys.Date()
> today
[1] "2017-03-29"
> today - months(1)
[1] NA
我确实加载了 lubridate,但我认为此计算是使用基础 R 执行的。如果我减去 2 个月或更多个月,它工作正常:
> today - months(2)
[1] "2017-01-29"
> today - months(3)
[1] "2016-12-29"
有人对可能发生的事情有任何想法吗?
更新:我认为这与不处理闰年情况的简单日期减法有关(2017 年不是闰年,因此 "2017-02-29"
不存在)。
有没有考虑闰年的其他包/函数?对于上面的示例,我希望答案恢复到上个月的最后一天,即:
today - months(1)
# Should yield:
"2017-02-28"
今天和昨天的计算结果相同(或者 ISO 对此的约定是什么)有意义吗?
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] xlsx_0.5.7 xlsxjars_0.6.1 rJava_0.9-8 MRAtools_0.6.8 stringdist_0.9.4.4 stringr_1.2.0
[7] stringi_1.1.3 lubridate_1.6.0 data.table_1.10.4 PKI_0.1-3 base64enc_0.1-3 digest_0.6.12
[13] getPass_0.1-1 RPostgreSQL_0.5-1 DBI_0.5-1
loaded via a namespace (and not attached):
[1] magrittr_1.5 rstudioapi_0.6 tools_3.3.2 parallel_3.3.2
一个月前在此上下文中未定义。 2月29日只存在于闰年
Note: Arithmetic with periods can results in undefined behavior when non-existent dates are involved (such as February 29th in non-leap years). Please see Period-class for more details and %m+% and add_with_rollback for alternative operations.
lubridate
包可以处理你正在做的事情,但你需要使用%m+%
来执行操作。
月份的计算确实是由基数 R 执行的,但不是你想的那样。 Months 用于获取日期对象的月份。
#Example
today <- Sys.Date()
months(today)
[1] "March"
要添加或减去月份,您应该使用 %m+%
from lubridate
:
today <- Sys.Date()
today %m+% months(-1)
[1] "2017-02-28"