Подсчет дней года с високосными годами - PullRequest
0 голосов
/ 01 марта 2019

Я сейчас пытаюсь закодировать это в R. Я хотел бы взять мою дату в формате %Y-%m-%d (ex: 2017-12-31) и преобразовать ее в день года.Тем не менее, я бы хотел, чтобы 28.02 считалось днем ​​№ 59, а 03.01 - днем ​​61.Когда это не високосный год, он просто пропустит # 60.Таким образом, 01.01 всегда № 1, а 31.12 всегда № 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"))

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Вот функция, которая делает эту работу.Он суммирует все месяцы, предшествующие текущему месяцу, добавляет дни для текущего месяца, а затем добавляет високосный день, если месяц идет после февраля.

# 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

Создано в 2019-03-01 представьте пакет (v0.2.1)

0 голосов
/ 01 марта 2019

Вы можете использовать функцию 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.Подобные идеи, хотя.Удачи!

0 голосов
/ 01 марта 2019

Один из вариантов будет использовать эту функцию:

Как учитывать високосные годы?

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}
...