2017-08-01 4 views
0

Étant donné un rasterbrick avec des années naturelles (Jan-Dec), comment peut-on le convertir pour avoir des années hydrologiques (à partir du 1st October and ending on the following 30th September)? Quelque chose de similaire (mais pas exact) à la question here.Convertir l'année naturelle en années hydrologiques séries chronologiques Rasterbrick R

données Exemple:

 nl <- 768 
    s <- brick(nrows = 510, ncols = 1068, 
        xmn = -180, xmx = 180, ymn = -90, ymx = 90, 
        crs = "+proj=longlat +datum=WGS84", 
        nl = nl,values=TRUE) 
     dates <- seq(as.Date("1950-01-01"), as.Date("2013-12-31"), by = "month") 
     s <- setZ(s, dates) 
vals <- 1:ncell(s) 
s[]=vals 

Répondre

0

Je wrote a function pour cela il y a un certain temps.

to_wateryear <- function(thedate){ 
    thedate = as.Date(thedate) 
    year = as.integer(substr(thedate, 1, 4)) 
    cutoff = cutoff = as.Date(paste(year, '-10-01', sep='')) 
    return(ifelse(thedate < cutoff, 
      year*1000 + thedate - as.Date(paste(year - 1, '-09-30', sep='')), 
      (year + 1)*1000 + thedate - as.Date(paste(year, '-09-30', sep='')))) 
} 

Exemples:

to_wateryear(as.Date(Sys.time())) 
to_wateryear('2013-10-01') 
# leap year behavior 
to_wateryear('2012-09-30') 
to_wateryear('2013-09-30') 
to_wateryear('2012-02-29') 
to_wateryear('2013-03-31') 

EDIT De vos commentaires il semble que ce que vous voulez réellement est de divisé votre rasterbrick par année d'eau, au lieu de représenter les dates en ce qui concerne l'année hydrologique.

library(raster) 
nl <- 768 
s <- brick(nrows = 510, ncols = 1068, 
    xmn = -180, xmx = 180, ymn = -90, ymx = 90, 
    crs = "+proj=longlat +datum=WGS84", 
    nl = nl,values=TRUE) 

dates <- seq(as.Date("1950-01-01"), as.Date("2013-12-31"), by = "month") 
# use water year 
s <- setZ(s, to_wateryear(dates)) 
vals <- 1:ncell(s) 
s[]=vals 

# split by water year 
hyears = unique(getZ(s) %/% 1000) 
res = vector("list", length(hyears)) 
for(i in 1:length(hyears)) 
    res[[i]] = s[[which(getZ(s) %/% 1000 == hyears[i])]] 
names(res) = paste0("HY", hyears) 
+0

Cela pourrait être très utile. Pouvez-vous le tester sur ma 'rasterbrick, s'? – code123

+0

J'ai fourni des exemples de données ci-dessus. Je vais l'essayer quand je vais à mon ordinateur. Cependant, SVP essayer et laissez-moi savoir si cela fonctionne pour vous. Merci. – code123

+0

J'ai essayé ce qui suit mais j'ai obtenu des nombres au lieu de dates: 's <- setZ (s, to_wateryear (dates))' – code123