如何为多组.tif气候数据添加时间维度并转换为stars对象?
解决方法:将WorldClim多变量月度数据转为带时间维度的stars对象
核心问题在于,RasterStack转为stars对象时,默认将各图层识别为attributes维度,而非时间维度。以下是正确的处理流程,可实现多变量整合并支持按日期筛选:
1. 单个变量的时间维度处理
对每个气候变量(降水、温度、最高温),读取为RasterStack后,直接将attributes维度重定义为time维度,并赋予对应日期:
# 读取降水数据并转为带时间维度的stars对象 rastlist_prec <- list.files(path = "my/path/prec/WorldClim_2.1_prec_30s/clipped_2024-10-09_16-35-06", pattern = "wc2.1", full.names = TRUE) stack_prec <- stack(rastlist_prec) stars_prec <- st_as_stars(stack_prec) %>% # 将原attributes维度转为time,赋值1980年1-4月日期 st_set_dimensions(which = "attributes", values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")), names = "time") %>% # 重命名属性为变量名 st_set_names("prec") # 同理处理温度数据 rastlist_temp <- list.files(path = "my/path/temp/...", pattern = "wc2.1", full.names = TRUE) stack_temp <- stack(rastlist_temp) stars_temp <- st_as_stars(stack_temp) %>% st_set_dimensions(which = "attributes", values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")), names = "time") %>% st_set_names("temp") # 同理处理最高温度数据 rastlist_tmax <- list.files(path = "my/path/tmax/...", pattern = "wc2.1", full.names = TRUE) stack_tmax <- stack(rastlist_tmax) stars_tmax <- st_as_stars(stack_tmax) %>% st_set_dimensions(which = "attributes", values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")), names = "time") %>% st_set_names("tmax")
2. 整合多变量到统一stars对象
将三个变量按新增的variable维度合并,确保时间维度对齐:
# 合并三个变量,新增variable维度 stars_clim <- c(stars_prec, stars_temp, stars_tmax, along = "variable") # 为variable维度赋值变量名称 stars_clim <- st_set_dimensions(stars_clim, which = "variable", values = c("prec", "temp", "tmax"))
3. 按日期筛选数据
完成维度定义后,可直接按时间或变量筛选数据:
# 筛选1980年2月的所有气候变量数据 feb_clim_data <- stars_clim %>% filter(time == as.Date("1980-02-01")) # 筛选1980年1-2月的降水数据 prec_jan_feb <- stars_clim %>% filter(time %in% as.Date(c("1980-01-01", "1980-02-01")), variable == "prec")
原方法问题说明
之前重复stars对象再合并的操作,会导致维度叠加混乱,错误地将时间维度拆分为独立属性。正确逻辑是直接将每个变量的图层维度转为time,再通过变量维度整合多数据。
内容的提问来源于stack exchange,提问作者Rocío Beatriz Cortés
相关产品推荐
相关产品推荐

