【问题标题】:Substract years and days to a dataframe将年和日减去数据框
【发布时间】:2015-07-09 20:35:24
【问题描述】:

我需要减去两年,然后在下面的日期中加上一天。使用包 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),DAY(AW2)+1)

【问题讨论】:

  • 这个函数是矢量化的 我想知道为什么它返回NA,它是可能的,因为它是一个未来的数据?
  • years 函数正在寻找2014-02-29,但找不到。尝试解决方法ymd(df$ServiceDate) - days(731)

标签: r lubridate


【解决方案1】:

使用持续时间年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

或者如我在 cmets 中所说,按天计算:

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

【讨论】:

  • 下面是想要的输出
  • 我收到了您第一次请求的输出,但您的请求没有反映您想要的更新后的输出。上述两种解决方案都有效。
【解决方案2】:

年份和月份并不是定义明确的间隔,但您似乎希望使用 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

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2011-02-14
    • 1970-01-01
    • 2016-06-21
    • 2013-12-10
    相关资源
    最近更新 更多