繁体   English   中英

R中的netCDF文件

[英]netCDF files in R

我有从此处获得的netCDF文件,名称为precip.mon.total.v6.nc 我在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,您应该尝试使用它代替。 您需要确定是要按时间读取数据还是按时间步读取数据。 这在普通的2D网格上更容易设想:

  • 随时随地使用单个单元格
  • 所有位置一次完成

您的时间跨度是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$xprecip$y会有所帮助。 一旦拥有它(例如,单元格x = 5和y = 10):

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

(一)记忆:

如果在Linux机器上[sudo apt-get install cdo](或安装了cygwin的Windows)上,则可以使用cdo来帮助您。

例如,如果您只对特定日期感兴趣,则可以先选择该日期以减小文件大小:

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度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM