我有一个 netcdf 文件,其中包含从 1991 年到 2000 年(10 年)的每月全球数据。
使用 CDO,如何通过每月每天重复每月值来将 netcdf 从每月时间步长修改为每日时间步长?
举个例子,
convert from
Month 1, value = 0.25
to
Day 1, value = 0.25
Day 2, value = 0.25
Day 3, value = 0.25
....
Day 31, value = 0.25
convert from
Month 2, value = 0.87
to
Day 1, value = 0.87
Day 2, value = 0.87
Day 3, value = 0.87
....
Day 28, value = 0.87
谢谢
############## 更新
我的每月 netcdf 的每月值不是在每个月的第一天,但顺序稀疏。例如15 日、7 日、9 日等...但是每个月都有一个值。
这个问题的措辞可能含糊不清。阿德里安·汤普金斯的答案对于插值来说是正确的。但是,您实际上要求将每月每一天的值设置为该月第一天的值。您可以通过添加第二个 CDO 调用来完成此操作,如下所示:
cdo -inttime,1991-01-01,00:00:00,1day in.nc temp.nc
cdo -monadd -gtc,100000000000000000 temp.nc in.nc out.nc
只需将 gtc 之后的值设置为远高于数据中的任何值即可。
您可以使用
inttime
,它按所需的时间间隔进行插值,但这并不完全是您所要求的,因为它不会重复每月的值,并且您的系列将通过插值进行平滑。
如果我们假设您的数据集于 1 月 1 日的时间 00:00 开始(您没有在问题中说明),那么命令将是
cdo inttime,1991-01-01,00:00:00,1day in.nc out.nc
这在步骤之间执行简单的线性插值。
注意:这对于温度等字段来说很好,并且似乎是您所要求的,但读者应该注意,人们必须更加小心降雨量等通量字段,在这些字段中,人们可能需要适当地缩放和/或更改单位.
我无法使用 CDO 找到解决方案,但我使用 R 解决了该问题,如下所示:
library(dplyr)
library(ncdf4)
library(reshape2)
## Read ncfile
ncpath="~/my/path/"
ncname="my_monthly_ncfile"
ncfname=paste(ncpath, ncname, ".nc", sep="")
ncin=nc_open(ncfname)
var=ncvar_get(ncin, "nc_var")
## melt ncfile
var=melt(var)
var=var[complete.cases(var), ] ## remove any NA
## split ncfile by gridpoint (lat and lon) into a list
var=split(var, list(var$lat, var$lon))
var=var[lapply(var,nrow)>0] ## remove any empty list element
## create new list and replicate, for each gridpoint, each monthly value n=30 times
var_rep=list()
for (i in 1:length(var)) {
var_rep[[i]]=data.frame(value=rep(var[[i]]$value, each=30))
}
如果问题是您每月的“天数”是可变的,我建议您将每个月度文件的日期设置为恒定,例如01.
infiles=$(ls your_file*.nc)
for f in $infiles
do
outfile="${f%.*}_01.nc"
cdo setday,1 \
$f $outfile
done
然后您可以按照 Robert Wilson 的建议应用代码