En este modulo, vai aprender: 1. Ler dados de vazao com “url”. 2. Separar descarga em “baseflow” e “stormflow”. 3. Calcular vazoes minimas.
Sera que conversao de floresta a pastagem tem mudado as vazoes minimas?
Todos os arquivos apresentado aqui foram baixado a http://www.snirh.gov.br/hidroweb/ O formato dos arquivos de hidroweb nao podem ser leito directamente em R. Escrevi outra programma para reformatar os arquivos no formato csv.
Coloquei um arquivo csv em Google Dirve; pode le-lo directamente usando “read.csv” e “url”. “Qdf” eh a variavel que tem os dados. “df” significa “data.frame”.
Este arquivo eh para o Rio Jamari em Ariquemes (15430000)
Qdf = read.csv(url("https://docs.google.com/spreadsheets/d/e/2PACX-1vTXp46RFu7HRh3uVgeWMWXIz_9zbotUlXRjd8JNCEoxsecbMRXIpfVJ9oLm3vHbVT06nZSxmKvLdaZu/pub?gid=586467714&single=true&output=csv"))
Ou, pode cargar o arquivo que fez em Modulo 1:
pasta.dados = "C:/minha_pasta/Rcurso2021/dados/"
setwd(pasta.dados)
Qdf = read.csv("Q.Jaru.csv")
E ver o que tem no arquivo nas primeiras 6 linhas
head(Qdf)
## Date Q.cms Status
## 1 1977-12-01 NA NA
## 2 1977-12-02 NA NA
## 3 1977-12-03 NA NA
## 4 1977-12-04 NA NA
## 5 1977-12-05 NA NA
## 6 1977-12-06 NA NA
e nas ultimas 6 linhas:
tail(Qdf)
## Date Q.cms Status
## 15181 2020-11-25 213.152 1
## 15182 2020-11-26 203.465 1
## 15183 2020-11-27 190.820 1
## 15184 2020-11-28 193.952 1
## 15185 2020-11-29 209.904 1
## 15186 2020-11-30 211.525 1
R trata datas como objectos especificos. Tem que formatar usando as.Date.
Qdf$Date = as.Date(Qdf$Date)
head(Qdf)
## Date Q.cms Status
## 1 1977-12-01 NA NA
## 2 1977-12-02 NA NA
## 3 1977-12-03 NA NA
## 4 1977-12-04 NA NA
## 5 1977-12-05 NA NA
## 6 1977-12-06 NA NA
plot(Qdf$Date,Qdf$Q.cms,type="l")
plot(Qdf$Date,Qdf$Q.cms,type="l",xlab="Data",ylab="Vazao, metros cubicos por segundo")
datas.sub = as.Date(c("2006-08-01","2008-10-31"))
Qsub = Qdf[(Qdf$Date <= datas.sub[2]) & (Qdf$Date >= datas.sub[1]),]
plot(Qsub$Date,Qsub$Q.cms,type="l",xlab="Data",ylab="Vazao, metros cubicos por segundo")
R tem varios “libraries” ou grupos de programmas que tem que ser implementado. Use “install.packages” para baixar, e “library” para encargar o library.
Nos vamos usar “EcohydRology”, que tem varios funcoes para hidrologia. A descriccao de EcohydRology esta aqui: https://cran.r-project.org/web/packages/EcoHydRology/EcoHydRology.pdf
install.packages("EcohydRology")
install.packages("hydroTSM")
library(EcoHydRology)
library(hydroTSM)
?BaseflowSeparation
q = Qsub$Q.cms
dates.nona = Qsub$Date[!is.na(q)]
q.nona = q[!is.na(q)]
bt eh “baseflow” qt eh “quickflow”
bsep = BaseflowSeparation(q.nona)
head(bsep)
## bt qft
## 1 208.4367 21.24859
## 2 209.5058 37.16421
## 3 209.9444 33.28955
## 4 210.1806 29.63636
## 5 209.7294 30.08756
## 6 207.4277 28.99030
tail(bsep)
## bt qft
## 818 175.7915 47.21853
## 819 172.4361 43.98293
## 820 168.8497 60.82726
## 821 165.2367 44.66727
## 822 161.8761 41.58890
## 823 159.0167 31.80333
plot(Qsub$Date,Qsub$Q.cms,type="l",xlab="Data",ylab="Vazao, metros cubicos por segundo")
lines(dates.nona,bsep$bt,col="grey",lwd=2)
Identifica vazoes minimas usando library “hydrostats” e funccao “low.spells”.
So tem que installar uma vez:
install.packages("hydrostats")
E cargar:
library(hydrostats)
## Warning: package 'hydrostats' was built under R version 4.1.1
?low.spells
quant=0.1 significa que vai achar os 10% valores menores
lows = low.spells(flow.ts = data.frame(Date=Qsub$Date,Q=Qsub$Q.cms),quant=0.1,plot=TRUE,ann.stats = TRUE)
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
#
O que tem em “lows”?
lows
## low.spell.threshold min.low.spell.duration avg.low.spell.duration
## 1 184.614 2 9
## med.low.spell.duration max.low.duration low.spell.freq avg.min.ann cv.min.ann
## 1 6 35 10 151.908 NA
## ann.min.timing ann.min.timing.sd ann.min.min.dur ann.min.avg.dur
## 1 264 0 Inf NaN
## ann.min.max.dur
## 1 -Inf
Limitar as analyses para anos que tem dados para o ano enteiro (1971-2015):
Qdf.71.15 = Qdf[(Qdf$Date >= as.Date("1971-01-01")) & (Qdf$Date <= as.Date("2015-12-31")),]
Qdf.71.15$Q = Qdf.71.15$Q.cms # "low.spells" precisa que o nome do vazao ser "Q"
#Para isso, precisa de "plyr":
install.packages("plyr")
library(plyr)
## Warning: package 'plyr' was built under R version 4.1.1
Faca uma coluna “ano”:
Qdf.71.15$Ano = format(Qdf.71.15$Date,"%Y")
# Qdf$Q = Qdf$Q.cms
anos = unique(Qdf.71.15$Ano)
Para cada ano, calcula a vazao minima (10%), e coloca numa figura.
Qmins = data.frame(Ano=anos,Qmin=NA)
Qlen = data.frame(Ano=anos,Ndatas=NA)
for (i in 1:length(anos)){
ano = anos[i]
todosdatas = diy(ano)
Qsub = Qdf.71.15[Qdf.71.15$Ano==ano,]
Qlen[i,] = c(ano,length(!is.na(Qsub$Q.cms)))
Qinterp = approx(Qsub$Date, Qsub$Q, xout=as.Date(todosdatas))
Qinterp.df = data.frame(matrix(unlist(Qinterp),ncol=length(Qinterp),byrow=FALSE))
names(Qinterp.df) = c("Date","Q")
Qinterp.df$Date = as.Date(Qinterp.df$Date)
low.spells.data = low.spells(Qinterp.df, quant=0.1,plot=FALSE)
low.thresh = low.spells.data$low.spell.threshold
plot(Qinterp.df$Date,Qinterp.df$Q,type="l",main=ano,xlab="",ylab="Q cms")
lines(Qsub$Date,Qsub$Q,col="blue")
Qlow.values = Qinterp.df[Qinterp.df$Q<=low.thresh,]
points(Qlow.values$Date,Qlow.values$Q,col="red",pch=20)
Qmins$Qmin[i]= mean(Qlow.values$Q,na.rm=TRUE)
}
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
## Warning in max(x$lengths[which(x$values == 1)]): no non-missing arguments to
## max; returning -Inf
## Warning in min(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## min; returning Inf
## Warning in max(ann.min.events.max.dur, na.rm = T): no non-missing arguments to
## max; returning -Inf
## Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
## collapsing to unique 'x' values
Qmins
## Ano Qmin
## 1 1977 504.5680
## 2 1978 197.8170
## 3 1979 176.3579
## 4 1980 148.9213
## 5 1981 131.0626
## 6 1982 200.4470
## 7 1983 110.8060
## 8 1984 156.2814
## 9 1985 187.5778
## 10 1986 242.4044
## 11 1987 137.1843
## 12 1988 155.8036
## 13 1989 963.1379
## 14 1990 267.6119
## 15 1991 223.7045
## 16 1992 206.7573
## 17 1993 182.5533
## 18 1994 193.6643
## 19 1995 171.4238
## 20 1996 195.0835
## 21 1997 180.5380
## 22 1998 100.1150
## 23 1999 135.0359
## 24 2000 159.7374
## 25 2001 161.6262
## 26 2002 162.5200
## 27 2003 186.1578
## 28 2004 166.9223
## 29 2005 161.2029
## 30 2006 188.5087
## 31 2007 165.1982
## 32 2008 178.8712
## 33 2009 165.5627
## 34 2010 166.2533
## 35 2011 171.4454
## 36 2012 165.9003
## 37 2013 215.5777
## 38 2014 242.7976
## 39 2015 238.5201
plot(Qmins$Ano,Qmins$Qmin,xlab="",ylab="Qmin, cms",type="l")
Incluir secas fortes identificado na literatura (Marengo et al., 2016)
anos.secas = c(1981,1983,1995,1998,2005,2010,2015)
Qmin.secas = merge(data.frame(Ano=anos.secas),Qmins,by.y="Ano")
plot(Qmins$Ano,Qmins$Qmin,xlab="",ylab="Qmin, cms",type="l")
points(Qmin.secas$Ano,Qmin.secas$Qmin,pch=20,col="red")
Qmins$Qmin[as.numeric(Qlen$Ndatas)<365]=NA
plot(Qmins$Ano,Qmins$Qmin,xlab="",ylab="Qmin, cms",type="l")
points(Qmin.secas$Ano,Qmin.secas$Qmin,pch=20,col="red")