4

我下载了1998年-2016年的netCDF格式的TRMM月降水率,所以大约有200多个文件。这些文件的名称是 3B43.19980101.7.HDF.nc 3B43.19980201.7.HDF.nc 3B43.19980301.7.HDF.nc,等等。我想将所有这些文件连接到一个 netCDF 中。我尝试使用 NCO 运算符“ncrcat”,它应该能够沿记录维度连接一系列很长的文件,在这种情况下是时间,但到目前为止还没有运气。起初我尝试了简单的只有 2 个文件

ncrcat -O -h 3B43.19980101.7.HDF.nc 3B43.19980201.7.HDF.nc out.nc

得到

错误:没有用于处理的变量拟合标准

所以我尝试了

ncks --mk_rec_dmn time 3B43.19980101.7.HDF.nc TD.3B43.19980101.7.HDF.nc
ncks --mk_rec_dmn time 3B43.19980201.7.HDF.nc TD.3B43.19980201.7.HDF.nc

我再次尝试

ncrcat -O -h TD.3B43.19980101.7.HDF.nc TD.3B43.19980201.7.HDF.nc out.nc

仍然有同样的错误

错误:没有用于处理的变量拟合标准

有没有更简单的方法来处理 200 多个文件?我可以遵循的脚本?我对这一切都很陌生,所以请温柔一点。

任何帮助将不胜感激。我正在使用 Windows 7 x86。

4

2 回答 2

2

在 R 中,您可以通过读入所有数据并组合成一个大型 3d 数组(latxlonxtime)来做到这一点。例如,array[,,1] 将是 1998 年 1 月的 latxlon 网格。然后可以将其保存为 .rds 格式以在 R 中进一步使用,或者保存为 netCDF 文件,我不会介绍,但有在线将 R 数组保存为 .nc 文件的教程。

首先,制作一个 .csv 文件,其中包含您下载的所有文件名的单列。一种简单的方法是将在终端中键入“ls”的输出按 ctrl-C 键输入到 Excel 工作表中。下面的代码一个一个地读取这些文件,将每个文件添加到数组中。

library(ncdf4)
library(abind)
filenames=read.csv('TRMM.filenames.csv',head=F) #read in filenames
filenames=as.character(filenames[,1]) #convert to 'character' format

n.lon=192 #input the correct #'s here, must be the same for all files
n.lat=94

NA.matrix=matrix(rep(NA,n.lon*n.lat),nrow=n.lon) #used to initialize
prcp=array(NA.matrix,c(n.lon,n.lat,1)) #n.lonxn.latx1 array of NA's to initialize
for (i in 1:length(filenames)){
  ncdata=nc_open(filenames[i]) #read in file i, assuming files are in same location as filenames.csv/your current working directory
  #ncdata=nc_open(paste(data.dir,filenames[i],sep="")) #if your data is in another directory than the filenames.csv file, you could read it in with this line instead
  nc=ncvar_get(ncdata,"precip") #check the .nc files to see what the variable name actually is; this reads in the variable "precip"
  prcp=abind(prcp,nc)
}
prcp=prcp[,,-1] #remove the NA.matrix used to initialize

dim(prcp) #check that the lonxlatxtime dimensions make sense
saveRDS(prcp,'TRMM.all.rds') #save as .rds file, or proceed to save it as .nc file, which takes a bit more work
于 2016-10-10T19:58:23.120 回答
2

使用 NCO 完全可以做到这一点。我查看了您的输入文件,它们只是缺少时间维度,因此 ncrcat 失败。添加时间维度

ncecat -u time in.nc out.nc

然后按照上面所说的使用 ncrcat 。ps 我已将 ncrcat 和 ncra 错误消息更改为更明确地说明如何执行此操作。以前,提示仅适用于文件已经具有维度但已修复的情况。您的文件没有时间维度,因此您发出的 ncks 命令无效。

编辑以显示循环:

要在循环中执行此操作或类似操作,请使用类似的构造

for fl in `ls trmm*.nc`; do
    ncecat -u time ${fl} ${fl/trmm/trmm_new} # Base output name in input name
    ... # more processing
done

NCO 手册中有许多使用文件循环的示例。

于 2016-10-23T02:04:50.887 回答