目前我正在进行河流流量数据分析。我有从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)
答案 0 :(得分:7)
将日期存储在班级Date
的向量中,您可以使用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
答案 1 :(得分:3)
这是一个单行代码。
首先将日期转换为"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
答案 2 :(得分:2)
尝试与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)