R 中的 netCDF 文件

netCDF files in R

我从 here 获得了名称为 precip.mon.total.v6.nc 的 netCDF 文件。我在 R 中使用 ncdf 包来打开和分析文件。

 new <- open.ncdf("precip.mon.total.v6.nc")
    > new
    [1] "file precip.mon.total.v6.nc has 4 dimensions:"
    [1] "lat   Size: 360"
    [1] "lon   Size: 720"
    [1] "nbnds   Size: 2"
    [1] "time   Size: 1320"
    [1] "------------------------"
    [1] "file precip.mon.total.v6.nc has 1 variables:"
    [1] "float precip[lon,lat,time]  Longname:GPCC Monthly total of     precipitation Missval:-9.96920996838687e+36"

但是当我提取变量时,我得到了错误

      > get.var.ncdf(new, "precip")
Error: cannot allocate vector of size 2.5 Gb
In addition: Warning messages:
1: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
2: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
3: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)
4: In double(totvarsize) :
  Reached total allocation of 2047Mb: see help(memory.size)

我的查询是: (a) 如何处理内存问题? (b) 如何将此 netCDF 文件的分辨率从 0.5*0.5 更改为 0.25*0.25 数据?我在 MATLAB 中尝试过类似的问题。对于 netCDF 文件,它可以比 R 更好地解决内存问题。但是改变分辨率仍然是一个问题,因为我不擅长 MATLAB。我将非常感谢在这方面的任何帮助。

提取变量时,您需要指定所需的维度。目前您要求 R 获取所有内容,因此我怀疑它正在创建一个可能非常庞大的 3D 数组。

ncdf4 包通常会取代 ncdf,您应该尝试使用它。您需要决定是要按位置读取数据还是按时间步长读取数据。这在普通二维网格上更容易设想:

  • 所有时间步长的单个细胞
  • 所有位置单时间步长

你的是一个随时间变化的 3D 网格(尽管第 3 维只有两个波段),但看起来你的变量没有使用波段维度。这是一个基于 ncdf4 的 2D 工作流程,忽略您的条带:

包裹:

install.packages("ncdf4")
library(ncdf4)

打开连接:

nc = nc_open("~/dir/dir/file.nc")

对于一个时间步长的网格

读取维度:

precip = list()
precip$x = ncvar_get(nc, "lon")
precip$y = ncvar_get(nc, "lat")

读取数据(注意 start 是开始的维度索引,count 是从该点开始的观察次数,所以这里我们在第一个时间步读取整个网格):

precip$z = ncvar_get(nc, "precip", start=c(1, 1, 1), count=c(-1, -1, 1))
# Convert to a raster if required
precip.r = raster(precip)

在所有时间步读取单个单元格

您需要找到您的细胞索引,precip$xprecip$y 会有所帮助。一旦你有了它(例如单元格 x=5 和 y=10):

precip.cell = ncvar_get(nc, "precip", start=c(5, 10, 1), count=c(1, 1, -1))

(a) 内存:

如果在 linux 框 [sudo apt-get install cdo](或者 windows 安装了 cygwin)上,您可以使用 cdo 来帮助您。

例如,如果您只对特定日期感兴趣,您可以 select 首先缩小文件大小:

cdo seldate,date in.nc out.nc 

或者您可能想查看时间平均值:

cdo timmean in.nc out.nc 

这将减小文件大小,然后您可以在 R 中打开它来制作您的绘图(或使用 ncview 进行快速查看调查)。

(b) 重新映射

cdo 还可以将文件内插到 0.25 度,(虽然我不确定你为什么要这样做,因为你没有添加任何信息而且你正在使文件大四倍!!!)

cdo remapcon,r1440x720 in.nc out.nc

cdo remapnn,r1440x720 in.nc out.nc

但正如我所说,如果您想插值以与另一个 0.25 度产品(例如 TRMM)进行比较,最好采用另一种方式,将更精细的数据集插值到 0.5 度。

对了,2015年,GPCC发布了v7,还是0.5度。