我试图从日期中减去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)
您可以为此使用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)