将堆叠的每小时栅格数据聚合为六个小时图层

问题描述 投票:0回答:1

我在很长一段时间内有一大堆海面温度栅格层(每小时一个),但是我想找到这些层在六个小时周期 00:00 - 0600、0600 - 1200、1200 - 的平均值1800 和 1800 - 2400)。

当前名称示例:

names(sstrasters)
   [1] "X2021.01.31.00" "X2021.01.31.01" "X2021.01.31.02" "X2021.01.31.03" "X2021.01.31.04" "X2021.01.31.05" "X2021.01.31.06"
   [8] "X2021.01.31.07" "X2021.01.31.08" "X2021.01.31.09" "X2021.01.31.10" "X2021.01.31.11" "X2021.01.31.12" "X2021.01.31.13"
  [15] "X2021.01.31.14" "X2021.01.31.15" "X2021.01.31.16" "X2021.01.31.17" "X2021.01.31.18" "X2021.01.31.19" "X2021.01.31.20"
  [22] "X2021.01.31.21" "X2021.01.31.22" "X2021.01.31.23" "X2021.02.01.00" "X2021.02.01.01" "X2021.02.01.02" "X2021.02.01.03"
  [29] "X2021.02.01.04" "X2021.02.01.05" "X2021.02.01.06" "X2021.02.01.07" "X2021.02.01.08" "X2021.02.01.09" "X2021.02.01.10"
  [36] "X2021.02.01.11" "X2021.02.01.12" "X2021.02.01.13" "X2021.02.01.14" "X2021.02.01.15" "X2021.02.01.16" "X2021.02.01.17"

然后,我想创建一个仅包含这些平均图层的新栅格堆栈,命名如下(基于最后一小时):

2021 01 31: 0000 - 0600 = "X2021.01.31.06" 
2021 01 31: 0600 - 1200 = "X2021.01.31.12" 
2021 01 31: 1200 - 1800 = "X2021.01.31.18"
2021 01 31: 1800 - 2400 = "X2021.01.31.00"

我尝试使用索引,但对它们的工作原理有点困惑,堆栈不包含最后一整天,因此不能被 6 整除。

r gis raster
1个回答
1
投票

这是一个工作示例。为了将来,请添加一个最小的可重现示例,这样会更容易为您提供帮助。

library(terra)

#create an hourly sequence for 1 year
namer <- seq(as.POSIXct("2021-01-01 01:00:00"), as.POSIXct("2021-12-31 24:00:00"), by="hour")
#create example data with 1 layer for each hour
r <- rast(nrow = 10, ncol = 10, vals = rnorm(100),nlyrs=length(namer),time=namer)
#create indexes for aggregation
index <- rep(1:(length(namer)/6),each=6)
#aggregate with tapp
sixhourly <- tapp(r,index,fun=mean)
time(sixhourly) <- namer[seq(6,length(name),6)]

其想法是将栅格分成 6 层块(每小时一层)并计算平均值。

tapp
包中的函数
terra
正是为此目的而设计的。有关更多详细信息,请参阅
?tapp
,但它应用了
base::tapply()
相同的概念。 为了将名称分配给最终栅格,我对我感兴趣的名称进行了索引。但是,由于我们正在处理时间,因此这里最好的选择是将最终时间分配给
rast
对象的时隙函数
terra::time()<-
(如果您希望将时间信息指定为名称,请使用
names(sixhourly)<-namer[seq(6,length(name),6)])

© www.soinside.com 2019 - 2024. All rights reserved.