我使用R和润滑油。
我需要计算在一堆不同的日期范围内发生的闰日的数量。我已经做了很多谷歌搜索,但大多数结果似乎只是想找出某些年份是否是闰年,而没有考虑你在每年的开始和结束,或者是我不熟悉的不同程序。
我认为一个函数将是最好的方式,但很难得到的代码。
我的想法是使用润滑脂的leap_year
函数计算日期范围内的闰年数,然后检查周期开始和结束时的部分年,并在需要时添加/减去闰年计数。
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
中添加/减去,这就是我正在努力的地方。这种情况下期望的结果是3(2012年、2016年和2020年的闰年)。最后,我将检查许多不同的日期范围,而不仅仅是这一个。
任何帮助都是感激的。
如果你接受的前提"飞跃day"总是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