Есть ли функция R для расчета дня года воды? - PullRequest
2 голосов
/ 05 апреля 2019

Я пытаюсь создать R-функцию, которая определяет функции «День года в воде», аналогичные функциям «День года» (DOY), с помощью базы R или других различных пакетов (например, format(DATE,"%j")).Водные годы могут начаться 1 октября или 1 мая, поэтому стандартные функции DOY не работают.

В этой публикации и на этой веб-странице что-то сроднипроводится оценка «Дня Водного Года».Основным недостатком является то, что если у вас есть последовательные даты, индекс последовательного дня будет отключен, а не истинный «День Водного Года».Есть ли способ сделать это без использования индекса даты?

Ниже приведен очень неэффективный первый шаг.Есть ли способ оптимизировать это или сделать это по-другому, не создавая индекс по дням?

hydro.day=function(date,WY){
  require(lubridate)
  if(WY=="Fed"){jul.str=274};#"Federal" Water Year(WY) starts Oct 1
  if(WY=="FL"){jul.str=121};#"State" Water Year(WY) starts May 1

  doy.reg=data.frame(jul.day=c(seq(jul.str,365,1),
  seq(1,jul.str-1,1)),hydro.day=seq(1,365,1))

  doy.leap=data.frame(jul.day=c(seq(jul.str+1,366,1),
  seq(1,jul.str,1)),hydro.day=seq(1,366,1))

  hydro.day=data.frame()
  for(i in 1:length(date)){
    jul.day=as.numeric(format(date[i],"%j"))
    leap=leap_year(date[i])
    if(leap==F){tmp=merge(jul.day,doy.reg,by.x="x",by.y="jul.day")}
    else{tmp=merge(jul.day,doy.leap,by.x="x",by.y="jul.day")}
    hydro.day=rbind(hydro.day,tmp)
  }
  return(hydro.day$hydro.day)
}

Буду признателен за любую помощь.

1 Ответ

2 голосов
/ 05 апреля 2019

Это должно сделать это:

library(lubridate)
hydro.day.new = function(x, start.month = 10L){
  start.yr = year(x) - (month(x) < start.month)
  start.date = make_date(start.yr, start.month, 1L)
  as.integer(x - start.date + 1L)
}

Тестирование:

set.seed(123)
x = as.Date(as.POSIXct(sample(5000,10)*60*60*24, origin = "2000-01-01", tz = "GMT"))

hydro.day.new(x)
# [1]  70  16 311 123  43 321 174 166 289 180

hydro.day(x, "Fed")
# [1]  70  16 311 123  43 321 174 166 289 180
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...