从今天起减去1个月的R给出了NA

Amy*_*y M 7 r date subtraction lubridate calculation

我有一个脚本,其中我根据一些设定的时间段对我的数据进行子集化,并希望对上个月发生的所有记录进行子集化.

但是,如果我尝试从今天的日期减去一个月,则会产生一个NA:

> today <- Sys.Date()
> today
[1] "2017-03-29"
> today - months(1)
[1] NA
Run Code Online (Sandbox Code Playgroud)

我确实已经加载了润滑剂,但我认为这个计算是用基数R执行的.如果我减去2个月或更多个月它可以正常工作:

> today - months(2)
[1] "2017-01-29"
> today - months(3)
[1] "2016-12-29"
Run Code Online (Sandbox Code Playgroud)

有没有人对可能发生的事情有任何想法?

更新:我认为这与简单的日期减法有关,不处理闰年案例(2017年不是闰年所以"2017-02-29"不存在).

是否有其他包装/功能考虑到闰年?对于上面的例子,我希望答案恢复到上个月的最后一天,即:

today - months(1)
# Should yield:
"2017-02-28"
Run Code Online (Sandbox Code Playgroud)

这个计算是否有意义为今天和昨天提供相同的结果(或者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
Run Code Online (Sandbox Code Playgroud)

Pie*_*nte 12

几个月的计算确实由基数R计算,但不是你的想法.Months用于获取日期对象的月份.

#Example
today <- Sys.Date()
months(today)
[1] "March"
Run Code Online (Sandbox Code Playgroud)

要添加或几个月.减去,你应该使用%m+%lubridate:

today <- Sys.Date()
today %m+% months(-1)
[1] "2017-02-28"
Run Code Online (Sandbox Code Playgroud)


TAR*_*man 5

一个月前在这种情况下是未定义的。2月29日只存在于闰年。

请参阅lubridate文档

注意:当涉及不存在的日期时(例如非闰年的 2 月 29 日),带句点的算术可能会导致未定义的行为。请参阅Period-class 了解更多详细信息,并参阅%m+% 和add_with_rollback 了解替代操作。

lubridate包可以处理您正在做的事情,但您需要使用 来执行操作%m+%

  • 已接受@P Lapointe 的有效答案,但 +1 指出我在 lubridate 中找到有关此主题的具体帮助。 (2认同)