2013-12-20 244 views
1

雖然它應該很容易,但我將從GrADS的數據導出到.csv文件時遇到了實際困難。相關文件來自APHRODITE項目,涉及亞洲降雨量。基本上我可以用讀取這個文件到的GrADS:如何將數據從GrADs導出到.csv文件或從NetCDF導出爲.csv?

open d:/aphro/aphro.ctl 

,它告訴我說:

Data file d:/aphro/APHRO_MA_025deg_V1101R2.%y4 is open as file 1 
Lon set to 60.125 149.875 
Lat set to -14.875 54.875 
Lev set to 1 1 
Time values set: 1961:1:1:0 1961:1:1:0 
E set to 1 1 

如果我執行:

q ctlinfo 

它也告訴我,我有三個變量:

precip 1 0 daily precipitation analysis 
rstn 1 0 ratio of 0.05 degree grids with station 
flag 1 0 ratio of 0.05 degree grids with snow 

好吧,現在全部我想做的是在.csv文件中生成一個列表(或.txt)以下信息文件:

Precipitation Lon Lat Time(date) 

這聽起來很容易,但我不能這樣做。一種方法是使用:

fprintf precip d:/output.csv %g 1 

這給了我一個.csv文件與當天在一個長列中的全部數據(這是我想要的)。我也可以對不同文件中的lon和lat做同樣的處理並將它們結合起來。問題是,這需要輸出文件的年齡 - 如果你不介意大量的列,速度會更快,但這會變成一個難以管理的問題。基本上,這種方法太慢了。

另一種方法是通過將數據導出爲netCDF文件:

Set sdfwrite -4d d:/output.nc 
define var = precip 
sdfwrite precip 

這則很快寫了一個名爲output.nc文件,它包含了所有我需要的數據。使用R I然後可以單獨讀取所有變量,例如

f <- open.ncdf("D:/aphro/test.nc") 
A <- get.var.ncdf(nc=f,varid="time") 
B <- get.var.ncdf(nc=f,varid="rain") 
D <- get.var.ncdf(nc=f,varid="lon") 
E <- get.var.ncdf(nc=f,varid="lat") 

但我要的是使每行告訴我的時候,雨水量,經度和緯度的輸出文件。我嘗試了rbind,但它並沒有將正確的時間(日期)與正確的降雨量相關聯,同樣也會擾亂lon和lat,因爲有數十萬個降雨數據,但只有幾個日期,只有360個lon點和280個lon點經緯度點(即降雨數據是幾天內每天的數據網格)。我相信這應該很容易,但怎麼做呢?

請幫

託尼

+0

我正在使用NetCDF文件(來自TRMM的降雨數據...)我通過**柵格**數據包**磚**函數從**時空**數據包創建** STFDF **文件。給我充分的空間和時間的靈活性,很容易處理等等。抱歉,我現在還不能寫一個例子 –

+0

嘗試cbind(expand.grid(get.var.ncdf(nc = f,varid =「lon 「),get.var.ncdf(nc = f,varid =」lat「),get.var.ncdf(nc = f,varid =」time「)),get.var。ncdf(nc = f,varid =「rain」))但沒有我們只能猜測的文件更好的描述。 – mdsumner

+0

對於我通過使用cbind和get.var.ncdf方法來解決這個問題。首先,我在Grads中設定時間:set t 1 365即第一年數據,並使用sdfwrite輸出。使用R,並加載NCDF庫,我使用get.var.ncdf來讀取變量,經度和緯度。然後我使用cbind(expand.grid(lon,lat))擴展了lon和lat的網格,並擴展了變量,即expand.grid(variable)。然後我從變量中選擇了一天的價值,並再次使用cbind將它與lon,lat數據結合起來 - 並且每天重複一次。 – user2901667

回答

5

了我的知識,你可以改變的畢業生利用氣候數據操作和R文件一起到NetCDF文件。詳情可查詢here。此外,NetCDF文件可以轉換爲.csv文件。爲此,我提供了一個虛擬代碼。

library(ncdf) 
nc <- open.ncdf("foo.nc")    #open ncdf file and read variables 
lon <- get.var.ncdf(nc, "lon")   # Lon lat and Time 
lat <- get.var.ncdf(nc, "lat") 
time <- get.var.ncdf(nc, "time") 
dname <- "t"       # name of variable which can be found by using print(nc) 
nlon <- dim(lon) 
nlat<- dim(lat) 
nt<- dim(time) 
lonlat <- expand.grid(lon, lat) # make grid of given longitude and latitude 
mintemp.array <- get.var.ncdf(nc, dname) 
dlname <- att.get.ncdf(nc, dname, "long_name") 
dunits <- att.get.ncdf(nc, dname, "units") 
fillvalue <- att.get.ncdf(nc, dname, "_FillValue") 
mintemp.vec.long <- as.vector(mintemp.array) 
mintemp.mat <- matrix(mintemp.vec.long, nrow = nlon * nlat, ncol = nt) 
mintemp.df <- data.frame(cbind(lonlat, mintemp.mat)) 
options(width = 110) 
write.csv(mintemp.df, "mintemp_my.csv") 

我希望能解釋你的問題。