计算 R 中不同日期范围的闰日

Count leap days for different date ranges in R

我正在使用 R 和 lubridate。

我需要计算一组不同日期范围内出现的闰日数。我做了很多谷歌搜索,但大多数结果似乎只是想知道某些年份是否是闰年,但不考虑每年的开始和结束位置,或者是针对我不熟悉的不同程序。

我认为函数是最好的方法,但一直在努力编写代码。

我的想法是使用lubridate的leap_year函数统计日期范围内的闰年数,然后查看周期开始和结束的部分年份以及add/subtract到闰年计数(如果需要)。

start_date <- as.Date("2008-03-31")
end_date <- as.Date("2020-09-30")

years_list <- seq(start_date, end_date, by="years")
leap_days <- sum(leap_year(years_list))

下一步是在需要时检查 leap_days 的部分年份和 add/subtract,这正是我苦苦挣扎的地方。这种情况的预期结果是 3(2012 年、2016 年和 2020 年是闰年)。最终,我会检查很多不同的日期范围,而不仅仅是这个。

感谢任何帮助。

如果您接受“闰日”始终是 2 月 29 日这一前提,那么也许

grep("-02-29", seq(start_date, end_date, by = "day"), value = TRUE)
# [1] "2012-02-29" "2016-02-29" "2020-02-29"

这个函数似乎可以工作,返回闰日的总数。

count_leap_days <- function(x){
  if(!require(lubridate)){
    stop("install package 'lubridate'")
  }
  first_leap <- if(leap_year(x[1])) month(x[1]) %in% 1:2
  x <- x[-1]
  n <- length(x)
  if(n > 0){
    if(leap_year(x[n])) {
      last_leap <- (month(x[n]) >= 3) || (month(x[n] == 2 && day(x[n] == 29)))
      x <- x[-n]
    }
  }
  ly <- c(first_leap, leap_year(x), last_leap)
  sum(ly)
}
count_leap_days(years_list)
#[1] 3