我正在研究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)
在这段时间内是否可以计算任何函数/方法而无需制作太多栅格,并且计算可以保留为数组或矩阵?还是可以使上述代码更好地一次计算所有年份?
答案 0 :(得分:2)
您不提供数据,但我认为您可以执行以下操作:
library(raster)
nc <- brick('sstfile.nc')
dates <- getZ(nc)
months <- as.integer(format(dates, "%m"))
s <- stackApply(nc, months, fun=mean)
答案 1 :(得分:1)
如果我可以用R语言提供答案,如果您安装了cdo(安装了气候数据运算符),则可以在linux命令行上简单地完成此操作:
cdo ymonmean sstfile.nc sst_climate.nc
文件sst_climate.nc将包含12个时间步长,包括所有一月,二月等的平均值...
您可以使用
在ubuntu / mint中轻松安装cdo。sudo apt-get install cdo
,这几天您也可以在Windows 10中轻松安装ubuntu,以轻松访问这些有用的工具。 https://code.mpimet.mpg.de/projects/cdo/
处提供了文档