我当前正在尝试用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"))
答案 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代替。虽然类似的想法。祝好运!