CDO - 将 netcdf 文件从每月时间步长重新采样到每日时间步长

问题描述 投票:0回答:4

我有一个 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 日等...但是每个月都有一个值。

date netcdf cdo-climate
4个回答
2
投票

这个问题的措辞可能含糊不清。阿德里安·汤普金斯的答案对于插值来说是正确的。但是,您实际上要求将每月每一天的值设置为该月第一天的值。您可以通过添加第二个 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 之后的值设置为远高于数据中的任何值即可。


1
投票

您可以使用

inttime
,它按所需的时间间隔进行插值,但这并不完全是您所要求的,因为它不会重复每月的值,并且您的系列将通过插值进行平滑。

如果我们假设您的数据集于 1 月 1 日的时间 00:00 开始(您没有在问题中说明),那么命令将是

cdo inttime,1991-01-01,00:00:00,1day in.nc out.nc

这在步骤之间执行简单的线性插值。

注意:这对于温度等字段来说很好,并且似乎是您所要求的,但读者应该注意,人们必须更加小心降雨量等通量字段,在这些字段中,人们可能需要适当地缩放和/或更改单位.


0
投票

我无法使用 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))
}

0
投票

如果问题是您每月的“天数”是可变的,我建议您将每个月度文件的日期设置为恒定,例如01.

infiles=$(ls your_file*.nc)

for f in $infiles
do
    outfile="${f%.*}_01.nc" 
    cdo setday,1 \
        $f $outfile
done

然后您可以按照 Robert Wilson 的建议应用代码

© www.soinside.com 2019 - 2024. All rights reserved.