用leap年计算一年中的天数

时间:2019-03-01 14:13:49

标签: r date lubridate strftime leap-year

我当前正在尝试用R进行编码。我想使用%Y-%m-%d(例如:2017-12-31)格式的日期并将其转换为一年中的日期。但是,我希望始终将02/28视为第59天,将03/01视为第61天。如果不是a年,它将跳过#60。这样,01/01始终是#1,而12/31始终是#366。

我已经尝试使用strftime()yday(),但是在those年时,这两个都不会跳过第60天。根据是否是a年,它将使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"))

3 个答案:

答案 0 :(得分:2)

一种选择是使用此功能:

How to account for leap years?

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

然后编写一些代码,根据规则(例如,a年

 if(leap_year(mydate)== TRUE & day_num>60) {
 day_num + 1} else{
  day_num}

答案 1 :(得分:0)

这是完成任务的功能。它会汇总当月之前的所有月份,加上当月的天数,如果月份在2月之后,则加上the日。

# 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创建

答案 2 :(得分:0)

您可以使用lubridate的{​​{1}}函数。例如,

leap_year

编辑:看到这与@MDEWITT的解决方案非常相似,但是它使用lubridate代替。虽然类似的想法。祝好运!