CDO - 从每月到每天的时间步长对 netcdf 文件进行重采样

CDO - Resample netcdf files from monthly to daily timesteps

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

您可以使用 inttime,它会按所需的时间间隔及时插值,但这并不是您所要求的,因为它不会重复每月的值,并且您的系列将通过插值变得平滑。

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

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

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

注意:这对于像温度这样的字段来说很好并且似乎是你想要的,但是读者应该注意,对于降雨量这样的通量字段必须更加小心,人们可能想要缩放 and/or 适当更改单位。

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

我找不到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))
}