用闰年计算一年中的天数
Counting days of the year with leap years
我目前正在尝试在 R 中对此进行编码。我想采用 %Y-%m-%d
(例如:2017-12-31)格式的日期并将其转换为一年中的某一天.但是,我希望它始终将 02/28 计为第 59 天,将 03/01 计为第 61 天。如果不是闰年,它会跳过#60。这样,01/01 始终是#1,12/31 始终是#366。
我已经尝试过使用 strftime()
和 yday()
,但是当闰年时,这两个都不会跳过第 60 天。它只会使 12/31 成为第 365 天或第 366 天,具体取决于它是否是闰年。
如果有人知道我如何在 R 中编写此代码,那就太好了!非常感谢。
file <- read.table("PATHTOMYFILE", fill = TRUE, header = TRUE)
file <- file[-c(1), ]
file$datetime <- as.Date(as.character(file$datetime))
file <- file[which(file$datetime <= as.Date("2017-09-30")), ]
file$x <- file[, 4]
file$x <- as.numeric(as.character(file$x))
# Year-day function
yearday <- function(d){
# Count previous months
yd <- ifelse(lubridate::month(d) > 1, sum(lubridate::days_in_month(1:
(lubridate::month(d)-1))), 0)
# Add days so far in month & extra day if after February
yd <- yd + lubridate::day(d) + ifelse(lubridate::month(d)>2, 1, 0)
yd
}
file$Day <- yearday(as.Date((file$datetime), format = "%Y-%m-%d"))
一个选择是使用这个函数:
How to account for leap years?
leap_year <- function(year) {
return(ifelse((year %%4 == 0 & year %%100 != 0) | year %%400 == 0, TRUE, FALSE))
}
然后编写一些代码来根据您的规则(例如在闰年
if(leap_year(mydate)== TRUE & day_num>60) {
day_num + 1} else{
day_num}
这是一个可以完成这项工作的函数。它将当前月份之前的所有月份相加,添加当前月份的天数,如果月份在二月之后,则添加闰日。
# Year-day function
yearday <- function(d){
# Count previous months
yd <- ifelse(lubridate::month(d) > 1, sum(lubridate::days_in_month(1:(lubridate::month(d)-1))), 0)
# Add days so far in month & extra day if after February
yd <- yd + lubridate::day(d) + ifelse(lubridate::month(d)>2, 1, 0)
yd
}
# Test function
yearday(as.Date("2017-12-31", format = "%Y-%m-%d"))
#> [1] 366
yearday(as.Date("2017-03-01", format = "%Y-%m-%d"))
#> [1] 61
yearday(as.Date("2017-01-01", format = "%Y-%m-%d"))
#> [1] 1
由 reprex package (v0.2.1)
创建于 2019-03-01
您可以使用 lubridate
的 leap_year
功能。例如,
> library(lubridate)
>
> dates <- c(as.Date("2017-12-31"), as.Date("2016-12-31"))
>
> y <- as.Date("2016-12-31")
> z <- as.Date("2017-12-31")
>
> leap_every_year <- function(x) {
+
+ ifelse(yday(x) > 59 & leap_year(x) == FALSE, yday(x) + 1, yday(x))
+
+ }
>
> leap_every_year(y)
[1] 366
> leap_every_year(z)
[1] 366
> leap_every_year(dates)
[1] 366 366
编辑:看到这与@MDEWITT 的解决方案非常相似,但它使用了 lubridate。虽然有相似的想法。祝你好运!
我目前正在尝试在 R 中对此进行编码。我想采用 %Y-%m-%d
(例如:2017-12-31)格式的日期并将其转换为一年中的某一天.但是,我希望它始终将 02/28 计为第 59 天,将 03/01 计为第 61 天。如果不是闰年,它会跳过#60。这样,01/01 始终是#1,12/31 始终是#366。
我已经尝试过使用 strftime()
和 yday()
,但是当闰年时,这两个都不会跳过第 60 天。它只会使 12/31 成为第 365 天或第 366 天,具体取决于它是否是闰年。
如果有人知道我如何在 R 中编写此代码,那就太好了!非常感谢。
file <- read.table("PATHTOMYFILE", fill = TRUE, header = TRUE)
file <- file[-c(1), ]
file$datetime <- as.Date(as.character(file$datetime))
file <- file[which(file$datetime <= as.Date("2017-09-30")), ]
file$x <- file[, 4]
file$x <- as.numeric(as.character(file$x))
# Year-day function
yearday <- function(d){
# Count previous months
yd <- ifelse(lubridate::month(d) > 1, sum(lubridate::days_in_month(1:
(lubridate::month(d)-1))), 0)
# Add days so far in month & extra day if after February
yd <- yd + lubridate::day(d) + ifelse(lubridate::month(d)>2, 1, 0)
yd
}
file$Day <- yearday(as.Date((file$datetime), format = "%Y-%m-%d"))
一个选择是使用这个函数:
How to account for leap years?
leap_year <- function(year) {
return(ifelse((year %%4 == 0 & year %%100 != 0) | year %%400 == 0, TRUE, FALSE))
}
然后编写一些代码来根据您的规则(例如在闰年
if(leap_year(mydate)== TRUE & day_num>60) {
day_num + 1} else{
day_num}
这是一个可以完成这项工作的函数。它将当前月份之前的所有月份相加,添加当前月份的天数,如果月份在二月之后,则添加闰日。
# Year-day function
yearday <- function(d){
# Count previous months
yd <- ifelse(lubridate::month(d) > 1, sum(lubridate::days_in_month(1:(lubridate::month(d)-1))), 0)
# Add days so far in month & extra day if after February
yd <- yd + lubridate::day(d) + ifelse(lubridate::month(d)>2, 1, 0)
yd
}
# Test function
yearday(as.Date("2017-12-31", format = "%Y-%m-%d"))
#> [1] 366
yearday(as.Date("2017-03-01", format = "%Y-%m-%d"))
#> [1] 61
yearday(as.Date("2017-01-01", format = "%Y-%m-%d"))
#> [1] 1
由 reprex package (v0.2.1)
创建于 2019-03-01您可以使用 lubridate
的 leap_year
功能。例如,
> library(lubridate)
>
> dates <- c(as.Date("2017-12-31"), as.Date("2016-12-31"))
>
> y <- as.Date("2016-12-31")
> z <- as.Date("2017-12-31")
>
> leap_every_year <- function(x) {
+
+ ifelse(yday(x) > 59 & leap_year(x) == FALSE, yday(x) + 1, yday(x))
+
+ }
>
> leap_every_year(y)
[1] 366
> leap_every_year(z)
[1] 366
> leap_every_year(dates)
[1] 366 366
编辑:看到这与@MDEWITT 的解决方案非常相似,但它使用了 lubridate。虽然有相似的想法。祝你好运!