2010-07-22 3 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' оператора для него. –

+2

С difftime, я не думаю, что вы можете делать годы, просто дни или недели. – gt6989b

+0

Будьте осторожны в случае с Feb-29, потому что в результате объекта, вероятно, слоты wday/mon/mday не верны! Попробуйте: d = as.POSIXlt ('2016-02-29', tz = 'GMT'); d $ year = d $ year - 1' и проверьте значения 'd $ wday, d $ mon, d $ mday' – digEmAll

21

Вы можете использовать seq:

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

нет способа применить это к списку дат, хотя, если мне не хватает простого расширения – MichaelChirico

43

С lubridate

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

Откуда вы получаете lubridate? – Farrel

+0

От CRAN, как только помощник CRAN возвращается со своего отпуска. – hadley

+0

Вы писали lubridate? Я нашел обработку даты одним из самых раздражающих аспектов R. Итак, где я могу получить lubridate, не ожидая возвращения кого-то из отпуска? – Farrel

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 вычитать месяцев, как и другие методы будут возвращать либо 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

Получаете ли вы 28 февраля или 1 марта вопрос конвенции. Я считаю, что 'NA' явно неприемлемо. Спасибо за добавление информации. – gt6989b

 Смежные вопросы

  • Нет связанных вопросов^_^