Subtracting months - issue with last day of month?

断了今生、忘了曾经 提交于 2019-11-27 06:10:29

问题


Quick question on dates in R. Check out this snippet of code:

Sys.Date() - months(3)
# [1] "2013-12-31"
Sys.Date() - months(18)
# [1] NA

I've loaded the package lubridate and followed the instructions provided , and I can't quite get my head around this behavior. It used to work just fine, today's the first day that I've noticed that a subtraction of more than 12 months from today's date yields NA (subtracting less than 12 months works fine).

I'd appreciate if anyone can explain to me why this isn't working, and/or suggest a more "robust" way around it. Does it have something to do with today being the last day of the month (day 31)?

I'm asking because this works:

Sys.Date() - years(2)
# [1] "2012-03-31"

回答1:


The lubridate functions %m+% and %m-% are designed to handle this issue ("Add and subtract months to a date without exceeding the last day of the new month").

library(lubridate)
Sys.Date() %m-% months(18)
# [1] "2012-09-30"

# or to make it reproducible if Sys.Date() happens to be different from that in OP
as.Date("2014-03-31") %m-% months(18)
# [1] "2012-09-30"

# example of %m+%
as.Date("2014-01-31") + months(1)
# [1] NA
as.Date("2014-01-31") %m+% months(1)
# [1] "2014-02-28"



回答2:


The solution provides forward months exactly, i.e. 28Feb %m+% gives 28Mar, which is not ideal if working with month end data.

To adjust the top to always give you the last day of the month, use the following code:

ceiling_date((as.Date("2014-02-28") %m+% months(1)),"month")-days(1)

> "2014-03-31"



回答3:


Similarly if you want to have an increment of 3 months, it can be done as follows:

PW_Data_Plan_V1$Month = as.Date(PW_Data_Plan_V1$DOJ) %m+% months(3)


来源:https://stackoverflow.com/questions/22761199/subtracting-months-issue-with-last-day-of-month

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!