繁体   English   中英

R从.CSV创建NetCDF

[英]R create NetCDF from .CSV

我正在尝试从.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(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))

当我按照该程序进行操作时,它指出NC期望的数据量是我的3倍。 我了解了为什么每个维度都有一个矩阵,因为我说过变量是根据经度,纬度和时间来确定的。

那么,在每次数据采集中已经有了一个Lon,Lat,Time和其他变量的情况下,我将如何导入此类数据?

有人可以照亮吗?

PS:这里使用的数据不是我的真实数据,只是我在教程中使用的一些示例。

我认为您的代码中存在多个问题。 一步步:

创建尺寸

在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))

在我工作的地方,我们将无限制的维度用作索引,而与该维度同名的1d变量则保存值。 我不确定R中的无穷大尺寸是如何工作的。由于您不要求它,所以我将其省略了:-)

定义变量

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文件: ncnew <- nc_create(f, list(var_temp, var_rh))

当相加值时,保存数据的对象将熔化为一维数组,并在start指定的位置处开始顺序写入。 写入的尺寸由计数值控制。 如果您有这样的数据:

long, lat, time, t
   1,   1,    1, 1
   2,   1,    1, 2
   1,   2,    1, 3
   2,   2,    1, 4

命令ncvar_put(ncnew, var_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))

然后使用适合您的数据的尺寸创建一个数组:

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)

请注意,您不需要startcount

最后关闭nc文件,将数据写入磁盘nc_close(ncnew)可选)我建议您使用ncdump console命令检查您的文件。

编辑

关于您写一个完整的数组还是使用startcount我相信这两种方法都可以可靠地工作。 首选哪一个取决于您的数据和您的个人喜好。

我认为构建数组,添加值然后将其整体写入的方法更容易理解。 但是,在询问哪种方法更有效时,取决于数据。 如果您的数据量很大,并且具有许多NA值,我相信使用具有start和count的多次写入操作可能会更快。 如果不常见,则创建一个矩阵并执行一次写入会更快。 如果您的数据量很大,那么创建一个额外的数组将超出您的可用内存,则必须将这两种方法结合起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM