R 批读取netcdf文件并平均一个变量

R 批读取netcdf文件并平均一个变量,r,variables,netcdf,R,Variables,Netcdf,我是一个新的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) glob2rx(“sm197901*.1.nc”) ja

我是一个新的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)
glob2rx(“sm197901*.1.nc”)

jan看起来您可以将文件名组件“sm197901”、day、.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)
})

如果有大量数据要汇总,可以使用NetCDF Operator工具将每日数据汇总为每月平均数


与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”,我认为它仍然可以工作,因为文件将按时间顺序列出。

感谢Kith提供的提示帮助!在脚本的最后一部分,我应该在open.nc()中输入什么作为文件名?filename是一个包含构造文件名的变量。调用open.nc(filename)时,将构造的名称传递给函数。取消对print(filename)行的注释,它将打印出构造的文件名。对,然后我想从列表中获取变量,比如:
var.get.nc(ncfiles,“sm”,na.mode=0)
,但它说class(ncfile)==“NetCDF”不是真的。看起来ncfiles是我们刚刚构建的一个文件列表,它不能直接由nc file操作符访问。我问的原因是
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列表的每个元素并返回结果。对不起。您用“批处理文件”标记了此问题。是否需要Windows DOS批处理.bat文件解决方案?如果是,请张贴每日文件的格式(内容),并注明“sm”变量在其中的位置。如果没有,请从问题中删除“批处理文件”标签。
ncra DAILY/sm197901[*].1.nc MONTHLY/sm197901.1.nc
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