我在为r的日期,例如:如何减去年份?
dt = as.Date('2010/03/17')
我想从这个日期减去2年,而不用担心闰年和等问题,越来越as.Date('2010-03-17')
。
我该怎么做?
我在为r的日期,例如:如何减去年份?
dt = as.Date('2010/03/17')
我想从这个日期减去2年,而不用担心闰年和等问题,越来越as.Date('2010-03-17')
。
我该怎么做?
最简单的做法是将其转换为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?。
你可以使用seq
:
R> dt = as.Date('2010/03/17')
R> seq(dt, length=2, by="-2 years")[2]
[1] "2008-03-17"
有没有办法将这个应用到日期列表,但是,除非我错过了一个简单的扩展 – MichaelChirico 2015-02-02 00:23:43
相同的答案比一个由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"
如果闰日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"
无论你是2月28日还是3月1日都是约定俗成的事情。我同意,“NA”显然是不可接受的。感谢您添加信息。 – gt6989b 2016-09-26 16:33:50
RCS的回答以下是优选的 - 我们有'difftime'它的运营商。 – 2010-07-24 14:29:03
有了difftime,我不认为你可以做几年,几天或几周。 – gt6989b 2010-09-01 12:43:19
在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