use*_*667 1 csv r netcdf grads
我在将数据从GrADS导出到.csv文件时遇到了真正的困难,尽管它应该非常简单.该文件来自与亚洲降雨有关的APHRODITE项目.基本上我可以使用以下方法将此文件读入GrADS:
open d:/aphro/aphro.ctl
Run Code Online (Sandbox Code Playgroud)
它告诉我:
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
Run Code Online (Sandbox Code Playgroud)
如果我执行:
q ctlinfo
Run Code Online (Sandbox Code Playgroud)
它还告诉我,我有三个变量:
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
Run Code Online (Sandbox Code Playgroud)
好的,现在我想做的就是在.csv文件(或.txt)文件中生成一个列表,其中包含以下信息:
Precipitation Lon Lat Time(date)
Run Code Online (Sandbox Code Playgroud)
这听起来很容易,但我无法做到.一种方法是使用:
fprintf precip d:/output.csv %g 1
Run Code Online (Sandbox Code Playgroud)
这给了我一个.csv文件,其中包含当天在一个长列中的整个数据(这就是我想要的).我也可以为lon和lat在不同的文件中做同样的事情并将它们组合起来.问题是输出文件需要很长时间 - 如果你不介意很多列,它会快得多,但这会变得很难管理.基本上,这种方法太慢了.
另一种方法是通过以下方式将数据导出为NetCDF文件:
Set sdfwrite -4d d:/output.nc
define var = precip
sdfwrite precip
Run Code Online (Sandbox Code Playgroud)
然后,这很快就会写一个名为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")
Run Code Online (Sandbox Code Playgroud)
但我想要的是制作一个输出文件,其中每一行告诉我时间,下雨量,lon和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")
Run Code Online (Sandbox Code Playgroud)
我希望,它解释了你的问题.
| 归档时间: |
|
| 查看次数: |
4609 次 |
| 最近记录: |