如何从R中的日期减去月份?

use*_*905 36 r

我试图从日期中减去n个月,如下所示:

maturity <- as.Date("2012/12/31")

m <- as.POSIXlt(maturity)

m$mon <- m$mon - 6
Run Code Online (Sandbox Code Playgroud)

但结果日期是01-Jul-2012,而不是30-Jun-2012我所期望的.有没有简短的方法来获得这样的结果?

提前致谢

G. *_*eck 80

1)seq.Date.请注意,六月只有30天所以它不能给6月31日,因此它给7月1日.

seq(as.Date("2012/12/31"), length = 2, by = "-6 months")[2]
## [1] "2012-07-01"
Run Code Online (Sandbox Code Playgroud)

如果我们知道它是在月底,我们可以这样做:

seq(as.Date(cut(as.Date("2012/12/31"), "month")), length=2, by="-5 month")[2]-1
## "2012-06-30"
Run Code Online (Sandbox Code Playgroud)

2)常年.此外,如果我们知道它是月末,那么我们可以使用"yearmon"动物园包的类,如下所示:

ibrary(zoo)
as.Date(as.yearmon(as.Date("2012/12/31")) -.5, frac = 1)
## [1] "2012-06-30"
Run Code Online (Sandbox Code Playgroud)

这会将日期转换为"yearmon"减去6个月(一年的.5),然后将其转换回"Date"使用frac=1,这意味着月末(frac=0意味着月初).与先前的解决方案相比,这也具有自动矢量化的优点,即as.Date(...)可以是日期的矢量.

请注意,如果"Date"只将类用作表示月份的方式,那么我们可以完全摆脱它并直接使用,"yearmon"因为它首先模拟了我们想要的东西:

as.yearmon("2012-12") - .5
## [1] "Jun 2012"
Run Code Online (Sandbox Code Playgroud)

3)mondate.第三个解决方案是mondate软件包,它的优势在于它在6个月前返回月末,而不必知道我们是月末:

library(mondate)
mondate("2011/12/31") - 6
## mondate: timeunits="months"
## [1] 2011/06/30
Run Code Online (Sandbox Code Playgroud)

这也是矢量化的.

4)润滑.这个润滑的答案已经根据包装的变化而改变:

library(lubridate)
as.Date("2012/12/31") %m-% months(6)
## [1] "2012-06-30"
Run Code Online (Sandbox Code Playgroud)

lubridate也是矢量化的.

5)sqldf/SQLite

library(sqldf)
sqldf("select date('2012-12-31', '-6 months') as date")
##         date
## 1 2012-07-01
Run Code Online (Sandbox Code Playgroud)

或者如果我们知道我们在月底:

sqldf("select date('2012-12-31', '+1 day', '-6 months', '-1 day') as date")
##         date
## 1 2012-06-30
Run Code Online (Sandbox Code Playgroud)

  • 奇怪.如果我使用x = 2或4作为`as.Date("2012/12/31") - 月(x)`我得到了预期的结果.x = 1,3,5,6我得到了NA.知道为什么会这样吗? (2认同)
  • @giordano因为有些月份没有31天.试试`as.Date("2012/12/20") - 月(1:12)`. (2认同)

Ane*_*n K 5

您可以为此使用lubridate包

library(lubridate)
maturity <- maturity %m-% months(6)
Run Code Online (Sandbox Code Playgroud)

没有理由更改日期字段。

您可以将“日期”字段设置回该月的最后一天,方法是

day(maturity) <- days_in_month(maturity)
Run Code Online (Sandbox Code Playgroud)

祝好运!!!


小智 5

lubridate此类计算可以正确工作:

library(lubridate)
as.Date("2000-01-01") - days(1)    # 1999-12-31
as.Date("2000-03-31") - months(1)  # 2000-02-29
Run Code Online (Sandbox Code Playgroud)

但有时会失败:

as.Date("2000-02-29") - years(1)   # NA, should be 1999-02-28
Run Code Online (Sandbox Code Playgroud)