r - 使用 R 估计 NetCDF 数据的每月气候学
问题描述
我正在研究 31 年的 NOAA AVHRR 每日海面温度 (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(安装了气候数据操作员),您可以简单地在 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/
推荐阅读
- javascript - 是否可以通过js检测android设备上的硬件后退按钮单击事件?
- php - where 子句中的列“id_member”不明确
- active-directory - Active Directory whenChanged 属性
- c++ - 如何将boost数组表示为类型的指针?
- powerbi - 需要在 Power BI Slicer 中将当前日期限制为上个月末
- node.js - 我如何在不使用第三方的情况下使用 node.js 发送电子邮件
- java - 是否有一种排序方法可以采用多个比较器并在元素列表的排序顺序相同的情况下使用它们?
- android - Gradle 同步失败 - 无法确定当前字符
- mysql - 比较 HeidiSQL 中的两个 XML 数据库模式
- zsh - 在 vi 覆盖模式下使 zsh zle 恢复退格上的字符