2010-07-22 152 views
26

我在为r的日期,例如:如何减去年份?

dt = as.Date('2010/03/17') 

我想从这个日期减去2年,而不用担心闰年和等问题,越来越as.Date('2010-03-17')

我该怎么做?

回答

33

最简单的做法是将其转换为POSIXlt并从年份插槽中减去2。

> d <- as.POSIXlt(as.Date('2010/03/17')) 
> d$year <- d$year-2 
> as.Date(d) 
[1] "2008-03-17" 

请参阅此相关的问题:How to subtract days in R?

+0

RCS的回答以下是优选的 - 我们有'difftime'它的运营商。 – 2010-07-24 14:29:03

+2

有了difftime,我不认为你可以做几年,几天或几周。 – gt6989b 2010-09-01 12:43:19

+0

在2月29日的情况下要小心,因为产生的对象可能会有周六/周一/周日插槽不正确!试试:'d = as.POSIXlt('2016-02-29',tz ='GMT'); d $ year = d $ year - 1'并检查'd $ wday,d $ mon,d $ mday' – digEmAll 2018-02-19 18:20:57

21

你可以使用seq

R> dt = as.Date('2010/03/17') 
R> seq(dt, length=2, by="-2 years")[2] 
[1] "2008-03-17" 
+1

有没有办法将这个应用到日期列表,但是,除非我错过了一个简单的扩展 – MichaelChirico 2015-02-02 00:23:43

43

随着lubridate

library(lubridate) 
ymd("2010/03/17") - years(2) 
+0

从哪里可以得到lubridate? – Farrel 2010-07-23 15:06:01

+0

从CRAN开始,CRAN维护人员一回来就休假。 – hadley 2010-07-23 15:35:46

+0

你写过润滑吗? 我发现日期处理R的最令人烦恼的方面之一。 因此,我可以从哪里可以获得lubridate,而无需等待某人从度假返回? – Farrel 2010-07-24 14:23:26

2

相同的答案比一个由RCS但对一个向量操作它的可能性(以回答MichaelChirico,我可以评论我没有足够的代表):

R> unlist(lapply(c("2015-12-01", "2016-12-01"), 
     function(x) { return(as.character(seq(as.Date(x), length=2, by="-1 years")[2])) })) 
[1] "2014-12-01" "2015-12-01" 
6

如果闰日s的要加以考虑,那么我建议使用此功能lubridate减去个月,而其他方法将返回3月1日或NA:

> library(lubridate) 
> dt %m-% months(12*2) 
[1] "2008-03-17" 

# Try with leap day 
> leapdt <- as.Date('2016/02/29') 
> leapdt %m-% months(12*2) 
[1] "2014-02-28" 
+0

无论你是2月28日还是3月1日都是约定俗成的事情。我同意,“NA”显然是不可接受的。感谢您添加信息。 – gt6989b 2016-09-26 16:33:50