如何在R中把信息追加到netCDF文件中的数组?

4

这是我在长时间潜水后第一次在stackoverflow上发帖,请温柔点 :)

我正在使用R处理一个大型气候数据集,将其分成多个文件进行分析。每个文件中的数据完全相同,只是在不同的时间(每个文件大约有6个月的数据)。在对每个文件进行分析后,我会输出一个多维数组,该数组包含坐标(经度、纬度、高度、时间)处的压力值。

然后,我想将这些数组保存到netCDF文件中,但由于每个文件中的数据仅仅是在时间上分开的相同数据,因此我最终希望输出的数组可以连接成一个大数组存储在netCDF中,即为每个文件向已存在于netCDF文件中的数组添加新数据。

虽然我可以对第一个文件执行此分析,创建netCDF文件并将数组写入其中,但当我尝试将后续文件的数据附加到netCDF文件时,它会返回以下错误:

Error in R_nc_inq_varndims: NetCDF: Not a valid ID

Error in varndims.ncdf(nc, varid) : error returned from C call

在最初创建netCDF文件时,我使用了以下内容:

t <- dim.def.ncdf("Time","Hours since January 1st 1901",seq(time[1],time[ntime],24),unlim=TRUE)
latitude <- dim.def.ncdf("Latitude","Degrees",seq(90,-90,-3))
longitude <- dim.def.ncdf("Longitude","Degrees",seq(0,359.25,3))
h <- dim.def.ncdf("Geopotential Height",'km',seq(1,30))

定义变量本身

pressvar <- var.def.ncdf("Pressure", "hPa", list(longitude,latitude,h,t), longname="Pressure at set geopotential heights", missval=-999,prec="double")

然后创建文件并添加数据

ncnew <- create.ncdf(new.name, pressvar)
starting <- c(1,1,1,1)
ending <- c(nlon, nlat, 30, ntime)
put.var.ncdf(ncnew, pressvar, pressure, start = starting,  count = ending)
close.ncdf(ncnew)

如我所说,一切都很好。然后我打开下一个文件,重复分析并生成压力数组,打开原始的netCDF文件

put.var.ncdf(ncnew, pressvar, pressure, start = c(1,1,1,time[1]), count = c(nlon,nlat,30,time[ntime]))

变量time和ntime已经从第二个文件中读取。我认为问题出在我的start和count函数使用上,或者是我尝试使用无限时间维度,或者甚至是认为这是可能的。我需要重新定义每个文件的维度t和变量pressvar吗?还是这样会导致将一个完全相同命名的变量保存到netCDF文件中?如你所见,我对此感到有些困惑。

任何帮助都将不胜感激。谢谢!


似乎 put.var.ncdf 在您的 NetCDF 文件中找不到变量。尝试将最后一行更改为 put.var.ncdf(nc = ncnew, varid = 'Pressure', vals = pressure, start = c(1,1,1,time[1]), count = c(nlon,nlat,30,time[ntime]))。这会给你什么结果? - koekenbakker
@koekenbakker 看起来这个方法解决了问题!我知道这一定是什么简单的东西,非常感谢你 :) - Rabbidabbu
没问题,这种事情我也遇到过很多次。我会把我的评论发布为答案,如果您能勾选接受该答案,我会很高兴的 :) - koekenbakker
1个回答

1
似乎put.var.ncdf在您的NetCDF文件中找不到变量。尝试将最后一行更改为:
put.var.ncdf(nc = ncnew, varid = 'Pressure', vals = pressure, start = c(1,1,1,time[1]),  count = c(nlon,nlat,30,time[ntime]))

现在,varid正确地指向NetCDF文件中的变量名称,而不是引用由var.def.ncdf创建的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接