You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

解决方案

核心思路是从文件名提取日期,按自定义季节规则筛选图层:

  1. 提取栅格对应的日期
    从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")
    
  2. 标记季节分组
    根据月份判断所属季节:

    # 提取月份
    months <- month(dates)
    # 按规则标记季节
    season <- ifelse(months %in% 5:9, "summer", "winter")
    
  3. 拆分栅格堆栈
    根据季节标记筛选图层,生成两个新堆栈:

    # 夏季栅格堆栈
    sst_summer <- sst_stack[[season == "summer"]]
    # 冬季栅格堆栈
    sst_winter <- sst_stack[[season == "winter"]]
    
  4. 验证结果
    查看拆分后的堆栈信息确认正确性:

    # 查看夏季堆栈属性
    print(sst_summer)
    # 查看冬季堆栈属性
    print(sst_winter)
    

注意事项

  • 若文件名格式变动,需调整str_extract的正则表达式以正确提取日期
  • 冬季包含跨年度月份(如2012年10月至2013年4月),上述方法会自动按月份归类,无需额外处理年度

内容的提问来源于stack exchange,提问作者Alice Hobbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:02:03