R从.CSV创建NetCDF
我正在尝试从.csv文件创建NetCDF。我在这里和其他地方读过一些教程,但仍然有一些疑问 我有一张这样的桌子:R从.CSV创建NetCDF,r,gis,netcdf,R,Gis,Netcdf,我正在尝试从.csv文件创建NetCDF。我在这里和其他地方读过一些教程,但仍然有一些疑问 我有一张这样的桌子: lat,long,time,rh,temp 41,-109,6,1,1 40,-107,18,2,2 39,-105,6,3,3 41,-103,18,4,4 40,-109,6,5,2 39,-107,18,6,4 我使用R中的ncdf4包创建NetCDF xvals <- data$lon yvals <- data$lat nx <- length(xva
lat,long,time,rh,temp
41,-109,6,1,1
40,-107,18,2,2
39,-105,6,3,3
41,-103,18,4,4
40,-109,6,5,2
39,-107,18,6,4
我使用R中的ncdf4包创建NetCDF
xvals <- data$lon
yvals <- data$lat
nx <- length(xvals)
ny <- length(yvals)
lon1 <- ncdim_def("longitude", "degrees_east", xvals)
lat2 <- ncdim_def("latitude", "degrees_north", yvals)
time <- data$time
mv <- -999 #missing value to use
var_temp <- ncvar_def("temperatura", "celsius", list(lon1, lat2, time), longname="Temp. da superfície", mv)
var_rh <- ncvar_def("humidade", "%", list(lon1, lat2, time), longname = "humidade relativa", mv )
ncnew <- nc_create(filename, list(var_temp, var_rh))
ncvar_put(ncnew, var_temp, dadostemp, start=c(1,1,1), count=c(nx,ny,nt))
xvals我认为您的代码中存在不止一个问题。逐步:
创建维度
mv <- -999 #missing value to use
var_temp <- ncvar_def("temperatura", "celsius",
list(lon1, lat2, time_d),
longname="Temp. da superfície", mv)
var_rh <- ncvar_def("humidade", "%",
list(lon1, lat2, time_d),
longname = "humidade relativa", mv )
在nc文件中,维度不作为键值,只有一个值向量定义变量数组中每个位置的含义。
这意味着您应该创建如下尺寸:
xvals <- unique(data$lon)
xvals <- xvals[order(xvals)]
yvals <- yvals[order(unique(data$lat))]
lon1 <- ncdim_def("longitude", "degrees_east", xvals)
lat2 <- ncdim_def("latitude", "degrees_north", yvals)
time <- data$time
time_d <- ncdim_def("time","h",unique(time))
命令ncvar\u put(ncnew,var\u temp,data$t,count=c(2,2,1))
将提供您(可能)期望的结果
对于您的数据,第一步是为维度创建索引:
data$idx_lon <- match(data$long,xvals)
data$idx_lat <- match(data$lat,yvals)
data$idx_time <- match(data$time,unique(time))
请注意,您不需要开始
和计数
最后关闭nc文件以将数据写入磁盘nc\u close(ncnew)
或者,我建议您使用ncdump
console命令检查文件
编辑
关于您是否要编写完整的数组或使用start
和count
的问题,我相信这两种方法都是可靠的。选择哪一个取决于您的数据和个人喜好
我认为构建数组、添加值然后将其作为一个整体写入的方法更容易理解。然而,当询问什么更有效时,这取决于数据。如果您的数据很大,并且有很多NA值,我相信使用多个写操作和start和count会更快。如果NA很少见,创建一个矩阵并进行单次写入会更快。如果数据太大,创建一个额外的数组将超过可用内存,则必须将这两种方法结合起来 布埃菲什,首先,非常感谢你花时间来帮助我。第二,我非常感谢你清晰的答案和示例代码。这对我帮助很大。我是围绕着这个想法跳舞的,有着同样的想法,但对解决方案不是很清楚。我主要关心的是给给定维度赋予错误值的可能性。使用start
和count
属性是否可靠?或者使用指数化,如你所示,会更合适吗?这两种方法都非常有效。我将更多地研究无限的维度,因为我相信这是必要的。谢谢你,伙计。雷加西,谢谢你的好话。我编辑了我的答案,试着解释一下什么时候用什么方法。还要注意的是,在中,ncvar_put
是一个沿无限维写入3d数据的示例。您好,再次感谢@Bluefish。你的回答再一次帮助澄清了一些想法。我读到的关于这个主题的一切现在都清楚了。再次感谢你,伙计。顺致敬意,
data$idx_lon <- match(data$long,xvals)
data$idx_lat <- match(data$lat,yvals)
data$idx_time <- match(data$time,unique(time))
m <- array(mv,dim = c(length(yvals),length(xvals),length(unique(time))))
for(i in 1:NROW(data)){
m[data$idx_lat[i],data$idx_lon[i],data$idx_time[i]] <- data$temp[i]
}
ncvar_put(ncnew, var_temp,m)