2010-07-22 110 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