簡體   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