维护聚合栅格的时间维度 (Z)

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

我正在按纬度、经度和图层聚合一个大型 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 中?

r datetime aggregate raster netcdf
1个回答
0
投票

按照建议,一个“最小的可重现示例”会有所帮助。但是,当 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, ...

,而栅格的时间段则填充用于聚合的一周的第一天。 这里有两件事:


您没有为层聚合指定任何函数。在这里,我想您想要每周的平均值;
  1. 随着时间的推移聚合时,时间信息会丢失。您将拥有一个新栅格,其中包含与前一个栅格不直接相关的另一时间信息(例如,虽然 2023/01/01 对您有意义,但 week_53 则不然。您可以将 week_53 中的任意一天分配给其时间段) .
  2. 如果您想创建用于聚合每个新图层的每一天的列表,您可以使用
  3. ?tapp
  4.  的“详细信息”部分中的信息
    
“周”遵循 ISO 8601 定义。每周从星期一开始。如果包含 1 月 1 日的一周在新年中有四天或更多天,则该周被视为“01”周。否则为上一年的最后一周(“52”或“53”周,下周为第 1 周。

所以列表会是这样的:

library(lubridate) list_days <- split(time(r),isoweek(time(r)))

请注意,
isoweek(time(r))

返回每天的周索引。 要确认

tapp
使用了相同的索引,您可以尝试:
isoweekly <- tapp(r,index=isoweek(time(r)),fun=mean)

你会看到它与名为 
weekly

的栅格相同(显然除了图层名称

    

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