如何减去年数?

gt6*_*89b 41 r date date-arithmetic r-faq

我在R有一个日期,例如:

dt = as.Date('2010/03/17')
Run Code Online (Sandbox Code Playgroud)

我想从这个日期减去2年,而不用担心闰年和这样的问题as.Date('2010-03-17').

我该怎么办?

had*_*ley 66

lubridate

library(lubridate)
ymd("2010/03/17") - years(2)
Run Code Online (Sandbox Code Playgroud)

  • 这对于years年不起作用:ymd(“ 2016/02/29”)-years(2)返回NA。使用`%m-%months(24)`会返回“ 2014-02-28”`。而且要特别确定的是,%m-%months(48)返回“ 2012-02-29”。 (3认同)
  • 这是 lubridate 的预期行为。润滑的文档明确指出:考虑一个简单的操作,1 月 31 日 + 一个月。答案是否应该是:* 2 月 31 日(不存在)* 3 月 4 日(1 月 31 日之后的 31 天),或 * 2 月 28 日(假设它不是闰年) 算术的基本属性是 a + b - b = 一。只有解决方案 1 遵守此属性,但它是一个无效日期...如果添加或减去一个月或一年创建一个无效日期,lubridate 将返回一个 NA。 (3认同)

Sha*_*ane 47

最简单的方法是将其转换为POSIXlt并从年份槽中减去2.

> d <- as.POSIXlt(as.Date('2010/03/17'))
> d$year <- d$year-2
> as.Date(d)
[1] "2008-03-17"
Run Code Online (Sandbox Code Playgroud)

看到这个相关问题:如何减去R中的天数?.

  • 有了difftime,我认为你不能做几年,几天或几周. (3认同)
  • 在 2 月 29 日的情况下要小心,因为结果对象可能会有不正确的 wday/mon/mday 槽!尝试:`d=as.POSIXlt('2016-02-29',tz='GMT');d$year=d$year - 1` 并检查 `d$wday,d$mon,d$ 的值星期日` (3认同)

rcs*_*rcs 24

你可以使用seq:

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

  • 但是,除非我缺少一个简单的扩展名,否则无法将其应用于日期列表 (4认同)

小智 7

如果要考虑闰日,那么我建议使用这个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"
Run Code Online (Sandbox Code Playgroud)