R 用闰年计算一年中的天数

R 用闰年计算一年中的天数,r,date,lubridate,strftime,leap-year,R,Date,Lubridate,Strftime,Leap Year,我目前正在尝试将其编码为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

我目前正在尝试将其编码为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"))

file一个选项是使用此功能:


这里有一个函数可以完成这项工作。它将当前月份之前的所有月份相加,将当前月份的天数相加,如果月份在2月之后,则将闰日相加

#年-日功能
年日[1]366
年月日(截止日期(“2017-03-01”,格式=“%Y-%m-%d”))
#> [1] 61
年月日(截止日期(“2017-01-01”,格式=“%Y-%m-%d”))
#> [1] 1

由(v0.2.1)创建于2019-03-01,您可以使用
lubridate
leap\u 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
>库(lubridate)
> 
>日期
>y z
>闰年59和闰年(x)=假,yday(x)+1,yday(x))
+   
+ }
> 
>闰年(y)
[1] 366
>闰年(z)
[1] 366
>闰年(日期)
[1] 366 366

编辑:这与@MDEWITT的解决方案非常相似,但它使用了lubridate。尽管有类似的想法。祝你好运

我运行您的代码时收到此警告消息。“警告消息:在1:(lubridate::month(d)-1):数字表达式有29220个元素:仅使用第一个元素”我的开始日期是1937-10-01,计数是正确的,直到1937-11-01,它再次在第275天开始。@SamanthaSullivan你能编辑你的问题,包括你正在运行的数据和准确代码,以便我可以重现这个问题吗?我添加了代码。我不知道如何添加表格。它只是以一个有5个标题的表开始。第三个标题称为“datetime”,其中日期为$Y-%m-%d格式,然后我添加了一个名为x的第六列,它只是我的第四列的重命名,这是我正在执行分析的数据值。如何添加数据?@SamanthaSullivan使用
dput
dump
并复制和粘贴输出,最容易添加数据。例如,
dump(“file”,”)
,如果您的数据帧被称为
file
。很高兴它有帮助!
 if(leap_year(mydate)== TRUE & day_num>60) {
 day_num + 1} else{
  day_num}
> 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