[英]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
谢谢
############## 更新
我的 monthly.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 开始(问题中没有 state),那么命令将是
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))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.