【问题标题】:How to concatenate monthly TRMM netCDF files into a single netCDF file using NCO or R on windows 7?如何在 Windows 7 上使用 NCO 或 R 将每月 TRMM netCDF 文件连接成单个 netCDF 文件?
【发布时间】:2017-02-14 07:46:20
【问题描述】:

我下载了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。

【问题讨论】:

  • 我可以访问 PPS TRMM FTP 服务器。您能否将链接发送到您正在访问的 3B43.19980101.7.HDF.nc 文件?我可以看看。
  • 有没有办法把这两个文件分享给我们?这将有助于诊断问题。你能为其中一个文件做一个ncdump -h [filename] 吗?
  • @EricBridger 我使用坐标 (15.04,-90.05),(15.31,-89.24) 从mirador.gsfc.nasa.gov 下载了文件
  • @N1B4 出于某种原因 ncdump 不适合我。安装后,如果我转到 NCO 文件夹,我可以找到:ncap2、ncatted、ncbo、ncea、ncecat、ncblint、ncks、ncpdq、ncra、ncrcat、ncrename 和 ncwa。但是没有 ncdump...

标签: r concatenation netcdf nco


【解决方案1】:

在 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

【讨论】:

  • n.lon = 192 & n.lat = 94 是什么意思?如何检查我的正确#?
  • 数据集的经纬度维度。在终端中,如果您安装并加载了 netCDF,您可以执行ncdump -h filename,它将打印摘要信息。否则,在 R 中打开您的文件之一:filename="3B43.19980101.7.HDF.nc"; ncdata=nc_open(filename); print(ncdata) 这将为您提供文件摘要,包括经度和纬度尺寸的“大小”。
  • 非常感谢杰克!使用您的脚本,我能够创建一个 rds 文件。但是,我真的很想将它保存为 nc 文件。知道在哪里可以找到有关此问题的更多信息吗?
【解决方案2】:

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

添加时间维度
ncecat -u time in.nc out.nc

然后按照上面所说的使用 ncrcat。 p.s.我已将 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 手册中有许多使用文件循环的示例。

【讨论】:

  • 谢谢!我认为这可能有效。现在我的最后一个问题是是否有办法循环执行此操作。我有 200 多个文件,我想添加一个时间维度,然后将它们连接在一起。
猜你喜欢
  • 2021-05-12
  • 2014-12-02
  • 2019-06-19
  • 2021-09-22
  • 2018-01-18
  • 2020-01-29
  • 1970-01-01
  • 2023-03-30
  • 2018-06-10
相关资源
最近更新 更多