【问题标题】:Is there a R function to calculate Day of Water Year?是否有R函数来计算水年的日子?
【发布时间】:2019-04-04 22:46:31
【问题描述】:

我正在尝试通过基本 R 或其他各种包(即format(DATE,"%j"))构建一个确定“水年”的 R 函数,类似于“一年中的一天”(DOY)函数。水年可以从 10 月 1 日或 5 月 1 日开始,因此标准 DOY 函数不起作用。

在这个post 和这个webpage 中执行类似于“水年之日”的评估。主要的缺点是如果您确实有连续日期,则连续日期索引将关闭,而不是真正的“水年日”。有没有办法在不使用日期索引的情况下做到这一点?

下面是一个非常低效的第一步。有没有办法优化这一点,或者以不同的方式来做,而不是基于天创建索引?

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

任何帮助将不胜感激。

【问题讨论】:

    标签: r date


    【解决方案1】:

    应该这样做:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2021-06-22
      相关资源
      最近更新 更多