如何解释闰年?

Gag*_*lva 15 r date

我对闰年有些怀疑,我怎么能确定使用这样的公式

add.years= function(x,y){    
if(!isTRUE(all.equal(y,round(y)))) stop("Argument \"y\" must be an integer.\n")
x <- as.POSIXlt(x)
x$year <- x$year+y
as.Date(x)
}
Run Code Online (Sandbox Code Playgroud)

它会考虑闰年,例如在观察数据集中添加100年?我该怎么控制呢?

我有一个时间序列数据集,有50年的观察:

   date    obs
1995-01-01 1.0
1995-01-02 2.0
1995-01-03 2.5
...
2045-12-30 0.2
2045-12-31 0.1
Run Code Online (Sandbox Code Playgroud)

数据集+ 100年

   date    obs
2095-01-01 1.0
2095-01-02 2.0
2095-01-03 2.5
...
2145-12-30 0.2
2145-12-31 0.1
Run Code Online (Sandbox Code Playgroud)

经过基本检查后,我注意到原始数据集和数据集后100年的行数相同.我不确定闰年之前的第29届Februray之前是否会出现3月1日非闰年的价值等等.

我可以检查闰年从使用chron的库函数leap.year,但是我想知道是否有这样做,以确保一个更简单的方法,与2月29日的天通该行以后的100年不存在将被删除,并且2月29日的新日期将添加NA值.

Ric*_*ton 14

您可以检查是否一年是闰年有leap_yearlubridate.

years <- 1895:2005
years[leap_year(years)]
Run Code Online (Sandbox Code Playgroud)

这个包也将处理2月29日不可能发生的情况.

ymd("2000-2-29") + years(1)    # NA
ymd("2000-2-29") %m+% years(1) # "2001-02-28"
Run Code Online (Sandbox Code Playgroud)

%m+%@VitoshKa所述,"添加月份"运算符会在实际日期不存在的情况下将日期回滚到上个月末.

  • lubridate 中的行为很久以前就发生了变化。您将在无效日期获得 NA。如果您想要滚动行为,请参阅 [%m+%](http://finzi.psych.upenn.edu/library/lubridate/html/mplus.html) 的文档。还有`period`和`Period-Class`的文档。 (2认同)

Ada*_*son 5

按照DarkDustDirk Eddelbuettel的建议,您可以轻松推出自己的leap_year功能:

leap_year <- function(year) {
  return(ifelse((year %%4 == 0 & year %%100 != 0) | year %%400 == 0, TRUE, FALSE))
}
Run Code Online (Sandbox Code Playgroud)

并将其应用于矢量数据:

years = 2000:2050
years[leap_year(years)]

[1] 2000 2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048
Run Code Online (Sandbox Code Playgroud)