2015-07-09 3 views
0

Мне нужно вычесть два года и добавить один день к датам, как показано ниже. Используя пакет lubridate, я могу вычитать даты из регулярных лет или високосных лет отдельно, но мне нужно делать оба одновременно.Выдача лет и дней в dataframe

df <- data.frame(
ServiceDate = c('2010-02-28','2016-02-29'), stringsAsFactors = F) 
df$ServiceDate <- as.Date(df$ServiceDate, "%Y-%m-%d") 

library(lubridate) 

df$TwoYearsEarlier <- ymd(df$ServiceDate) - years(2) + days(1) 

Это то, что я получаю от кода выше

df 
ServiceDate TwoYearsEarlier 
2010-02-28  2008-02-29 
2016-02-29   <NA> 

Есть ли способ известково дни для обоих в то же самое время?

Это желаемый результат:

df 
ServiceDate TwoYearsEarlier 
2010-02-28  2008-02-29 
2016-02-29  2014-03-01 

В Excel я использую что-то вроде этого

= ДАТА (ГОД (AW2) -2, МЕСЯЦ (AW2), ДЕНЬ (AW2) +1)

+0

это функции векторизованы Я задаюсь вопросом, почему он возвращает 'NA', это возможно, потому что это будущие данные? – SabDeM

+3

Функция 'years' ищет' 2014-02-29' и не может ее найти. Попробуйте обходное решение 'ymd (df $ ServiceDate) - days (731)' –

ответ

3

использование Продолжительность лет dyears

df$TwoYearsEarlier <- ymd(df$ServiceDate) - dyears(2) 
df 
# ServiceDate TwoYearsEarlier 
#1 2010-02-28  2008-02-29 
#2 2016-02-29  2014-03-01 

Или, как я уже говорил в комментариях, по дням:

df$TwoYearsEarlier <- df$ServiceDate - days(730) 
df 
# ServiceDate TwoYearsEarlier 
#1 2010-02-28  2008-02-29 
#2 2016-02-29  2014-03-01 
+0

Ниже нужный результат – user3357059

+0

У меня был результат, который вы сначала запросили, но ваш запрос не отражал ваш желаемый результат как обновленный. Оба решения выше работают. –

1

Годы и месяцы не очень хорошо определенные интервалы, но, похоже, вы хотите использовать интервал 2 * 365 дней, что является хорошо определена продолжительность:

> df$TwoYearsEarlier <- ymd(df$ServiceDate) + days(-2*365) 
> df 
    ServiceDate TwoYearsEarlier 
1 2010-02-28  2008-02-29 
2 2016-02-29  2014-03-01