Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

hydrological year time series

Tags:

time

r

Currently I am working on a river discharge data analysis. I have the daily discharge record from 1935 to now. I want to extract the annual maximum discharge for each hydrolocial year (start from 01/11 to next year 31/10). However, I found that the hydroTSM package can only deal with the natural year. I tried to use the "zoo" package, but I found it's difficult to compute, as each year have different days. Does anyone have some idea? Thanks.

the data looks like:

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

my code:

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)
like image 246
uared1776 Avatar asked Feb 27 '14 16:02

uared1776


People also ask

What does a hydrological time series show?

In subsurface hydrology, time series analysis has been mostly used for detecting trends in groundwater quality (Loftis, 1996; Broers and van der Grift, 2004; Chang, 2008; Visser et al., 2009). Streamflow statistics are extensively employed for the management and development of water resources.

What is the typically recommended number of years for determining long hydrological term trends?

The length (35 to 45 years) and quality (Bryant et al., 2011) of these records make WE-38 an ideal place to evaluate long-term climatic and hydrologic trends in the context of recent changes in regional and global climate.

What is hydrological forecasting?

Hydrological forecasts typically aim to translate meteorological observations and forecasts into estimates of river flows. Techniques can include rainfall-runoff (hydrologic) and hydrological and hydrodynamic flow routing models, and simpler statistical and water-balance approaches.

How do you collect hydrological data?

Hydrological data are collected by means of a number of technologies ranging from observing gauges, installed at flow measuring points, to automatic data recorders and remote sensing. Transmission of data from international hydrological data collection systems is done by telephone communication, radio, and satellite.


3 Answers

With dates stored in a vector of class Date, you can just use cut() and tapply(), like this:

## 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
like image 101
Josh O'Brien Avatar answered Sep 28 '22 01:09

Josh O'Brien


Here is a one-liner to do that.

First convert the dates to "yearmon" class. This class represents a year month as the sum of a year as the integer part and a month as the fractional part (Jan = 0, Feb = 1/12, etc.). Add 2/12 to shift November to January and then truncate to give just the years. Aggregate over those. Although the test data we used starts at the beginning of the hydro year this solution works even if the data does not start on the beginning of the hydro year.

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

This gives:

2001 2002 2003 
 365  730 1000 
like image 42
G. Grothendieck Avatar answered Sep 28 '22 01:09

G. Grothendieck


Try the xts package, which works together with 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)
like image 29
Fernando Avatar answered Sep 28 '22 03:09

Fernando