【问题标题】:lubridate::floor_date returns NAlubridate::floor_date 返回 NA
【发布时间】:2021-09-08 16:44:20
【问题描述】:

我正在尝试编写一个函数,给定日期start 和整数n,将n 月份添加到日期,然后取结果月份的最后一天。 但是,以下代码会为 n=8+12k 返回 NA,但似乎在其他情况下也有效。

library(lubridate)
start <- ymd("2020-06-29")
n <- 8
floor_date(start + months(n), "month") + months(1) - days(1)
>[1] NA

我想这在一定程度上是由于闰年的存在,但我仍然觉得它令人费解。另外,我在文档中找不到任何关于此的内容。

有人可以解释一下发生了什么,或者建议一种更好的方法来完成这项工作吗?

【问题讨论】:

  • 这可能是因为您在 2 月使用 floor_date() 声明,而只有 28 天,lubridate 在您要求 29 日时给出 NA
  • 试试这个,add_with_rollback(start, months(n)) + months(1) - days(3)
  • 尝试%m+%,“将 [...] 个月添加到日期,但不超过新月份的最后一天”,如所述,例如这里:Add/subtract 6 months (bond time) in R using lubridate
  • 谢谢@Henrik!我找不到那个答案

标签: r lubridate


【解决方案1】:

clock 包在这方面非常有用,因为它有一个明确的参数来指定你想用无效日期做什么。还有 date_end 函数。
我想你想要:(对于原生管道,R >= 4.1)

library(clock)
start <- parse_date("2020-06-29")
n <- 8
start |> add_months(n, invalid = "previous") |> date_end('month')

这给出了: [1] "2021-02-28"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多