【问题标题】:R subtracting 1 month from today's date gives NAR 从今天的日期减去 1 个月得到 NA
【发布时间】:2017-08-23 06:16:01
【问题描述】:

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

但是,如果我尝试从今天的日期中减去一个月,则会产生 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

【问题讨论】:

    标签: r date subtraction lubridate calculation


    【解决方案1】:

    一个月前在此上下文中未定义。 2 月 29 日只存在于闰年。

    lubridate documentation

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

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

    【讨论】:

    【解决方案2】:

    月份的计算确实是由基数 R 执行的,但不是您的想法。 Months 用于获取日期对象的月份。

    #Example
    today <- Sys.Date()
    months(today)
    [1] "March"
    

    要添加或减去月份,您应该使用%m+% from lubridate

    today <- Sys.Date()
    today %m+% months(-1)
    [1] "2017-02-28"
    

    【讨论】:

    • 当使用lubridate 时,months 函数会被覆盖,并且不会像 base R 那样发挥作用。
    • @TARehman 不,润滑功能是month,没有“s”。 Base R 有months
    • Base R 的months 函数不会接受数字,但是当我加载lubridate 时,我可以给months 一个数字。这是为什么?另请参阅文档:rdocumentation.org/packages/lubridate/versions/1.6.0/topics/…,这似乎表明它正在覆盖基本 R 函数。
    • 我认为是%m+% 函数接受更多输入,因为lubridate::months(Sys.Date()) 给出一个错误,指出months 不是lubridate 的一部分。
    • 这真的很奇怪,因为当lubridate 被加载时,months(1) 返回“1m 0d 0H 0M 0S”。我不是lubridate 的大用户,所以真的只是为了我自己的信息而不是任何东西。 :)
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多