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$x
和 precip$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度。
我从 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$x
和 precip$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度。