水文年份时间序列

时间:2014-02-27 16:04:11

标签: r time

目前我正在进行河流流量数据分析。我有从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)

3 个答案:

答案 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)