[英]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$x
和precip$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.