我正在尝试构建一个R函数,该函数通过基本R或其他各种程序包(即format(DATE,"%j")
)来确定类似于“年度日”(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)
}
任何帮助将不胜感激。
答案 0 :(得分:2)
这应该做到:
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