2015-07-09 12 views
0

我需要减去两年,并添加一天如下所示的日期。使用软件包lubridate,我可以分别从常规年份或闰年中减去日期,但我需要同时执行这两个操作。抽象的年份和日期到一个数据框

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我使用这样

= DATE(YEAR(AW2)-2,MONTH(AW2),日(AW2)+1)

+0

这函数是矢量化的我很想知道为什么它会返回“NA”,它可能是因为未来的数据? – SabDeM

+3

“年”功能正在寻找“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 
相关问题