R语言 水文年时间序列

cfh9epnr  于 2023-10-13  发布在  其他
关注(0)|答案(4)|浏览(107)

目前,我正在进行河流流量数据分析。我有从1935年到现在的每日出院记录。我想提取每个水文年的年最大流量(从01/11开始到明年31/10)。但是,我发现hydroTSM包只能处理自然年。我试着使用“动物园”包,但我发现它很难计算,因为每年都有不同的日子。有谁知道吗?谢谢.
数据看起来像:

01-11-1935 663
02-11-1935 596
03-11-1935 450
04-11-1935 381
05-11-1935 354
06-11-1935 312

我的代码:

mydata<-read.table("discharge")
colnames(mydata) <- c("date","discharge")

library(zoo)
z<-zooreg(mydata[,2],start=as.Date("1935-11-1"))

mydta$date <- as.POSIXct(dat$date)

q.month<-daily2monthly(z,FUN=max,na.rm = TRUE,date.fmt = "%Y-%m-%d",out.fmt="numeric")
q.month.plain=coredata(q.month)

z.month<-zooreg(q.month.plain,start=1,frequency=12)
kmbjn2e3

kmbjn2e31#

对于存储在类Date的vector中的日期,您可以使用cut()tapply(),如下所示:

## Example data
df <- data.frame(date = seq(as.Date("1935-01-01"), length = 100, by = "week"),
                 flow = (runif(n = 100, min = 0, max = 1000)))

## Use vector of November 1st dates to cut data into hydro-years
breaks <- seq(as.Date("1934-11-01"), length=4, by="year")
df$hydroYear <- cut(df$date, breaks, labels=1935:1937)

## Find the maximum flow in each hydro-year
with(df, tapply(flow, hydroYear, max))
#     1935     1936     1937 
# 984.7327 951.0440 727.4210 

## Note: whenever using `cut()`, I take care to double-check that 
## I've got the cuts exactly right
cut(as.Date(c("1935-10-31", "1935-11-01")), breaks, labels=1935:1937)
# [1] 1935 1936
# Levels: 1935 1936 1937
e0uiprwp

e0uiprwp2#

这里有一行代码可以做到这一点。
首先将日期转换为"yearmon"类。这个类表示一年一个月,表示一年的整数部分和一个月的小数部分(Jan = 0,Feb = 1/12,等等)。加上2/12将11月移到1月,然后截断为给予正好的年份。总的来说。虽然我们使用的测试数据从水电年年初开始 ,但即使数据不是从水电年年初开始,该解决方案也有效。

# test data
library(zoo)
z <- zooreg(1:1000, as.Date("2000-11-01")) # test input

aggregate(z, as.integer(as.yearmon(time(z)) + 2/12), max)

这给出:

2001 2002 2003 
 365  730 1000
lyfkaqu1

lyfkaqu13#

尝试xts包,它与zoo一起工作:

require(zoo)    
require(xts)

dates = seq(Sys.Date(), by = 'day', length = 365 * 3)
y = cumsum(rnorm(365 * 3))    
serie = zoo(y, dates)

# if you need to specify `start` and `end`
# serie = window(serie, start = "2015-06-01")

# xts function
apply.yearly(serie, FUN = max)
hc2pp10m

hc2pp10m4#

您可以使用lfstat包中的apply.seasonal函数,该函数对xts对象进行操作。
用一句话解决你的问题:

apply.seasonal(mydata, varying = "yearly", fun = max, origin = 11)

origin = 11表示水文年将从11月开始。

相关问题