0

我是新的 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)的文件作为文件名的一部分,然后循环整个月。

4

3 回答 3

2

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

ncra DAILY/sm197901[*].1.nc MONTHLY/sm197901.1.nc
于 2014-04-07T17:37:00.680 回答
0

看起来您可以将文件名组件“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)
})
于 2013-04-11T19:37:58.507 回答
0

与戴夫的 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”,我认为它应该仍然有效,因为文件将按时间顺序列出。

于 2017-04-28T13:43:32.660 回答