计算 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
我正在使用 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