r - 使用 R 估算 NetCDF 数据的每月气候学

标签 r netcdf cdo-climate

我正在研究 NOAA AVHRR 31 年的每日海面温度 (SST) 数据。数据采用 NetCDF 格式,维度为 28(经)x 40(纬度)x 11686(天)。我应该计算每月的气候平均值(例如 31 年的所有一月的平均值等等)。使用 ncdf4 和 chron 库,我能够以数组形式获取它。

ncin <- nc_open('sstfile.nc')
sst_array <- ncvar_get(ncin, 'sst')

由于时间变量与 SST 数据是分开的,所以我不得不使用它遍历数组。

is.leapyear <- function(year){
return(((year %% 4 == 0) & (year %% 100 != 0)) | (year %% 400 == 0))
}

dateseq <- seq(as.Date("1987-01-01"), as.Date("2018-12-31"), by=1)

我正在使用栅格库转换为栅格,然后进行计算。

for ( i in seq(11686)) {
dtft <- strsplit(as.character(as.Date(dateseq[i])), split = '-')
y <-  as.integer(dtft[[1]][1])
m <-  as.integer(dtft[[1]][2])
d <-  as.integer(dtft[[1]][3])
while (m == 1){
assign(paste0('r',y,'.',d), raster(matrix(sst_array[1:27, 1:38, i], 
nrow = 27, ncol = 38)))
m = m + 1
}
if (is.leapyear(y) == TRUE) (i = i + 366)
else (i = i + 365)
}

问题是它创建了太多的栅格并且首先计算月均值,然后计算年均值。

r87jan <- stack(mget(paste0('r1987.',1:31)))
r87janmean <- calc(r87jan, mean)

是否有任何函数/方法可以在这段时间内进行计算而无需制作如此多的栅格并且计算可以保持为数组或矩阵?或者可以改进上面的代码来一次计算所有年份的月平均值吗?

最佳答案

如果我可以提供不在 R 中的答案,如果您安装了 cdo(安装了气候数据运算符(operator)),您可以简单地在 linux 命令行上执行此操作:

cdo ymonmean sstfile.nc sst_climate.nc 

文件 sst_climate.nc 将包含 12 个时间步长,其中 1 月、2 月等所有时间步的平均值......

您可以使用

轻松地在 ubuntu/mint 中安装 cdo
sudo apt-get install cdo 

现在您还可以在 Windows 10 中轻松安装 ubuntu 以轻松访问这些有用的工具。此处提供文档 https://code.mpimet.mpg.de/projects/cdo/

关于r - 使用 R 估算 NetCDF 数据的每月气候学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54821567/

相关文章:

regex - 如何匹配正则表达式中的 n 个单词?

netcdf - 将 grib 转换为 netcdf 文件

python - 合并大量 netCDF 文件

python-3.x - 使用 xarray 更改坐标系以进行切片操作

python - 如何通过 OpenDAP 使用 xarray 打开多个 NetCDF 文件?

netcdf - 使用 CDO 或 NCO 沿非常规维度选择数据

python - 使用交错网格上的数据时计算以网格为中心的值

从 ggplot2 中的 geom_smooth 中删除线

r - 在 R 中,绘制连续/序列事件

r - 在 for 循环内增长列表会返回 NA