2013-12-20 246 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") 

我希望能解释你的问题。