繁体   English   中英

CDO - Resample.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

谢谢

############## 更新

我的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM