我正在按纬度、经度和图层聚合一个大型 RasterBrick。我原来的 RasterBrick 对象有一个设置的 Z 维度(即为每个图层分配了日期),但是当我聚合 Raster 时我会丢失这些日期。相反,Z 维度返回到layer.1、layer.2 等,而不是日期维度。
我需要与聚合栅格关联的日期列表(因此我最终可以使用 rts 包来制作时间序列),但不确定聚合后哪些日期与哪些图层关联。
如何确保获得与聚合后的图层相对应的准确日期列表?
我从一个大型海面温度建模数据集开始。我从 netCDF 文件中提取了数据。
rbrick <- brick(netCDF.data, xmn=min(lon), xmx=max(lon), ymn=min(lat), ymx=max(lat), crs="WGS84", transpose=T) %>% flip(2) # Create a RasterBrick from my netCDF data. lon and lat values are also extracted from the netCDF
yr <- ncvar_get(gfdl,'year'); mth <- ncvar_get(gfdl,'month'); day <- ncvar_get(gfdl,'day') # Extract time variables from the netCDF
tim <- as.POSIXct(paste(yr,mth,day,sep='-'),tz='UTC') # Format dates
rbrick.t <- setZ(rbrick, tim, name="Date") # Add Z dimension to RasterBrick
rbrick.t # Check the RasterBrick data--there's a beautiful Date dimension at the bottom!
weekly.5 <- aggregate(rbrick.t, fact=c(5, 6, 7), expand=T) # Lower the resolution of the RasterBrick to weekly data times a .5 degree grid cell resolution
weekly.5 # Check the RasterBrick data--my Date dimension is gone :(
最终,我希望能够从聚合的 RasterBrick 中获取日期的时间序列,以便我可以使用 rts 包从数据中创建时间序列,如下所示:
rt <- rts(rbrick, tim) # Make a rts object with time associated from a list of Dates
plot(rt[15]) # Plot the time series for cell number 15
如果我在聚合栅格时无法保留 Z 维度,如何为聚合栅格制作准确的日期列表以输入到 rts 中?
按照建议,一个“最小的可重现示例”会有所帮助。但是,当 terra::tapp
参数设置为时间范围(如您的情况下为“周”)时,
index
函数会以某种方式保留时间信息。请参阅下面的示例 library(terra)
#create a daily sequence for 1 year
namer <- seq(as.POSIXct("2021-01-01"), as.POSIXct("2021-12-31"), by="day")
#create example data with 1 layer for each hour
values <- rnorm(length(namer)*100)
r <- rast(nrow = 10, ncol = 10, vals =values ,nlyrs=length(namer),time=namer)
#aggregation
weekly <- tapp(r,"week",fun=mean)
agg <- aggregate(weekly,fact=c(5,6),fun=mean)
#eventually assign as time for each layer the first day of the week
time(agg) <- namer[seq(1,length(namer),7)]
图层名称列为
week_1, week_2, ...
,而栅格的时间段则填充用于聚合的一周的第一天。 这里有两件事:
您没有为层聚合指定任何函数。在这里,我想您想要每周的平均值;?tapp
的“详细信息”部分中的信息
所以列表会是这样的:
library(lubridate)
list_days <- split(time(r),isoweek(time(r)))
请注意,
isoweek(time(r))
返回每天的周索引。 要确认
tapp
使用了相同的索引,您可以尝试:isoweekly <- tapp(r,index=isoweek(time(r)),fun=mean)
你会看到它与名为
weekly
的栅格相同(显然除了图层名称