【问题标题】:Batch read netcdf files and average one variable批量读取netcdf文件并平均一个变量
【发布时间】:2013-04-11 18:20:34
【问题描述】:

我是新的 R 用户。我现在有 1979 年的每日 netcdf 数据,例如:
sm19790101.1.nc
sm19790102.1.nc
.
.
.
sm19791231.1.nc

我需要将一个名为“sm”的变量平均到每月分辨率。我现在可以这样做了:

glob2rx("sm197901*.1.nc")  
jan<-list.files(pattern=glob2rx("sm197901*.1.nc"),full.names=TRUE)

将所有 1 月份的数据移植到 jan,但我不知道如何打开每个文件并获取特定变量(我已经安装了 Rnetcdf 包)。如果我要手动执行此操作,则应该是:

s19790101<-open.nc("sm19790101.1.nc")  
sm19790101<-var.get.nc(s19790101,"sm",na.mode=0)  

然后平均它们...

我想问题是如何读取带有变量(例如 01-31)作为文件名的一部分的文件,然后循环整个月。

【问题讨论】:

  • 对不起。您用“批处理文件”标签标记了这个问题。您想要 Windows-DOS 批处理 .bat 文件解决方案吗?如果是,请发布每日文件的格式(内容)以及“sm”变量在其中的位置。如果没有,请从您的问题中删除“批处理文件”标签。

标签: r variables netcdf


【解决方案1】:

如果您有大量数据需要汇总,可以使用 NetCDF 算子工具http://nco.sourceforge.net/nco.html#ncra-netCDF-Record-Averager将每日数据汇总为月均值

ncra DAILY/sm197901[*].1.nc MONTHLY/sm197901.1.nc

【讨论】:

    【解决方案2】:

    看起来您可以将文件名组件“sm197901”、“天”、“.1.nc”粘贴在一起构造所需的文件名。

    #make sure it has a leading 0
    days = formatC(1:31, width=2, flag="0")
    ncfiles = lapply(days, function(d){
        filename = paste("sm197901", d, ".1.nc", sep="")
        #print(filename)
        open.nc(filename)
    })
    

    【讨论】:

    • 感谢 Kith 的及时帮助!那么在脚本的最后一部分,我应该在 open.nc() 中添加什么文件名?
    • filename 是一个包含构造文件名的变量。当您调用 open.nc(filename) 时,您将构造名称传递给函数。取消注释 print(filename) 行,它将打印出构造的文件名。
    • 对,然后我想从列表中获取变量,例如:var.get.nc(ncfiles,"sm",na.mode=0) 但它说 class(ncfile)=="NetCDF" 不正确。看起来 ncfiles 是我们刚刚构建的文件列表,不能直接被 nc 文件操作符访问。
    • 我问的原因是var.get.nc()只能读取open.nc()返回的“NetCDF”类对象
    • 我不确定 var.get.nc 是否是矢量化函数。您是否尝试过 sapply(ncfiles, function(file){var.get.nc(file, "sm", na.mode=0)}) ?这会将 var.get.nc 函数应用于 ncfiles 列表的每个元素并返回结果。
    【解决方案3】:

    与 Dave 的 ncra 答案类似,您也可以使用 cdo 进行操作

    cdo mergetime sm1979????.1.nc year.nc
    # you only need this next step if there is more than one variable in the file:
    cdo selvar,sm year.nc yearsm.nc  
    cdo monmean year.nc month.nc
    

    在某些系统上,打开文件的数量限制为 256 - 如果是这种情况,您可以将“mergetime”替换为“cat”,我认为它仍然可以工作,因为文件将按时间顺序列出。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多