Add 6 months to a date starting february
我正在尝试使用 lubridate 库从 2 月到日期减去 3 个月,但是,它总是给我 28 的日期。我知道很多人都问过这个问题,但我尝试了很多东西,但是仍然是同样的错误。循环一天是一种选择。但是,我一直在寻找有效的东西
我的代码是这样的:
其中 test_end = “2019-02-28”
和 lastnmonth = 3
as.Date(test_end) %m-% months(lastnmonth)
我总是得到输出为 “2018-11-28” 而不是 “2018-11-30”
- 那是 3 个月,而不是 6 个月。您可以编辑问题。
- 已更正。任何一个月份,日期都生成为 28。你会碰巧知道解决方案吗?
- 不,只是路过。不知道 r 或 lubridate 但是,应用常识,这完全取决于在给定上下文中被认为是”一个月”的内容。您可能需要搜索有关您使用的months() 函数(?) 的详细信息。而且您的第一句话仍然具有误导性-无论您减去哪个日期,您都会得到 28 吗?我不这么认为。
- 我提到,它是从二月开始的。所以要么 28 要么 29
使用 Dirk 的策略,我们可以设计一个函数来处理这种类型的操作:
1
2 3 4 5 6 7 8 9 10 11 12 |
start_date <- lubridate::ymd(“2019-02-28”)
mths_to_subtract <- 3
deduct_mth <- function(date_object = start_date, days_to_ceiling_date <- lubridate::ceiling_date(date_object,”months”) – date_object date_object + days_to_ceiling_date – lubridate::period(mths_to_deduct,”months”) – days_to_ceiling_date } |
给出以下答案:
1
2 3 4 |
> deduct_mth(ymd(“2019-02-28”), 3)
[1]”2018-11-30″ > deduct_mth(ymd(“2000-02-29”), 3) [1]”1999-11-30″ |
你想要一个月的最后一天——所以你可以使用下一个是第一个的技巧,将它移动月数——然后减去一天。
在一行base R:
1
2 3 |
R> seq(as.Date(“2019-02-28″) + 1, length=4, by=”-1 month”) – 1
[1]”2019-02-28″”2019-01-31″”2018-12-31″”2018-11-30″ R> |
我们添加一天,然后使用四个月的序列(包括当前)倒数,然后取出一天作为上个月的最后一天。
如果你只想要一个,只需添加 tail(…, 1):
1
2 3 |
R> tail(seq(as.Date(“2019-02-28″) + 1, length=4, by=”-1 month”) – 1, 1)
[1]”2018-11-30″ R> |
1
|
lubridate::ymd(“2019-02-28″) – lubridate::period(3,”months”)
|
额外的代码来锻炼 mont-end
1
|
lubridate::ceiling_date(lubridate::ymd(“2019-02-28″) – lubridate::period(3,”months”),”months”) – lubridate::ddays(1)
|
- 我试过了,不行。另外,我正在使用 Windows 而不是 mac(仅供参考)
- 所以它没有办法知道 28Feb 是一个月末,所以自然会带你回到当前日期的 3 个月。如果你想校准到月底,那么你需要告诉机器。我为此提供了额外的代码。
来源:https://www.codenong.com/55484337/