簡體   English   中英

如何將數據從GrADs導出到.csv文件或從NetCDF導出到.csv?

[英]How can I export data from GrADs to a .csv file or from NetCDF to .csv?

我確實很難將數據從GrADS導出到.csv文件,盡管這確實很容易。 有問題的文件來自與亞洲降雨有關的APHRODITE項目。 基本上,我可以使用以下命令將此文件讀入GrADS:

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的文件,其中包含我需要的所有數據。 然后,使用RI可以分別讀取所有變量,例如

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緯度點(即降雨數據是幾天內每天的數據網格)。 我敢肯定這應該很容易,但是怎么做呢?

請幫忙

托尼

據我所知,可以一起使用氣候數據運算符和R將GrAD文件更改為NetCDF文件。 詳細信息可以在這里找到。 此外,可以將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")

希望它能解釋您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM