如何在R语言中按自定义季节拆分SST栅格堆栈?
按自定义季节拆分SST栅格堆栈的R实现方法
背景信息
从NASA海洋色彩项目下载了2012至2024年的4640份L3m 4km NetCDF格式海表温度(SST)文件,并构建为RasterStack,其属性信息如下:
class : SpatRaster dimensions : 766, 709, 1 (nrow, ncol, nlyr) resolution : 0.04165021, 0.04165796 (x, y) extent : 24.61, 54.14, 5.8, 37.71 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 source : AQUA_MODIS.20120101.L3m.DAY.SST.x_sst.nc:sst varname : sst (Sea Surface Temperature) name : sst unit : degree_C
> sst_stack class : RasterStack dimensions : 766, 709, 543094, 4640 (nrow, ncol, ncell, nlayers) resolution : 0.04165021, 0.04165796 (x, y) extent : 24.61, 54.14, 5.8, 37.71 (xmin, xmax, ymin, ymax) crs : +proj=longlat +datum=WGS84 +no_defs names : Sea.Surface.Temperature.1, Sea.Surface.Temperature.2, Sea.Surface.Temperature.3, Sea.Surface.Temperature.4, Sea.Surface.Temperature.5, Sea.Surface.Temperature.6, Sea.Surface.Temperature.7, Sea.Surface.Temperature.8, Sea.Surface.Temperature.9, Sea.Surface.Temperature.10, Sea.Surface.Temperature.11, Sea.Surface.Temperature.12, Sea.Surface.Temperature.13, Sea.Surface.Temperature.14, Sea.Surface.Temperature.15, ...
野外工作中收集了2012至2024年珊瑚礁区域的海豚数量数据,需按自定义季节拆分上述栅格堆栈:
- 夏季:5月至9月
- 冬季:10月至次年4月
现有R代码如下:
# 下载海表温度数据 folder_SST <- "~/Documents/GIS_Data/SST." files_SST <- list.files(folder_SST, pattern='*.nc', full.names = TRUE) for (file in files_SST) { nc_SST = open.nc(files_SST) print.nc(nc_SST) } # 堆叠AQUA-MODIS文件为RasterStack sst_stack <- raster::stack(files_SST)
配套的数据框结构:
Survey_Number Dates Longitude_E_DD Latitude_N_DD SST 1 2012-08-01 33.89083 27.26778 23.635 2 2012-06-02 33.86782 27.40854 23.640 3 2012-02-07 33.86230 27.44623 23.690 4 2012-02-12 33.88653 27.26957 23.635 5 2012-02-13 33.88766 27.26848 23.635 6 2012-02-14 33.85000 27.36111 23.780 7 2012-02-15 33.86177 27.41302 23.640
解决方案
核心思路是从文件名提取日期,按自定义季节规则筛选图层:
提取栅格对应的日期
从NetCDF文件名中提取8位日期字符串,转换为日期格式:# 安装并加载所需包 install.packages(c("stringr", "lubridate")) library(stringr) library(lubridate) library(raster) # 提取文件名中的日期部分 date_str <- str_extract(files_SST, "\\d{8}") # 转换为Date对象 dates <- as.Date(date_str, format = "%Y%m%d")标记季节分组
根据月份判断所属季节:# 提取月份 months <- month(dates) # 按规则标记季节 season <- ifelse(months %in% 5:9, "summer", "winter")拆分栅格堆栈
根据季节标记筛选图层,生成两个新堆栈:# 夏季栅格堆栈 sst_summer <- sst_stack[[season == "summer"]] # 冬季栅格堆栈 sst_winter <- sst_stack[[season == "winter"]]验证结果
查看拆分后的堆栈信息确认正确性:# 查看夏季堆栈属性 print(sst_summer) # 查看冬季堆栈属性 print(sst_winter)
注意事项
- 若文件名格式变动,需调整
str_extract的正则表达式以正确提取日期 - 冬季包含跨年度月份(如2012年10月至2013年4月),上述方法会自动按月份归类,无需额外处理年度
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

