我有一個 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 日等。但是每個月都有一個值。
uj5u.com熱心網友回復:
這個問題的措辭可能模棱兩可。Adrian Tompkins 的答案對于插值是正確的。但是,您實際上要求將每月每一天的值設定為該月第一天的值。您可以通過添加第二個 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 之后的值設定為比資料中的任何值都高得多的值。
uj5u.com熱心網友回復:
您可以使用inttimewhich 在所需的時間間隔內及時插值,但這并不完全符合您的要求,因為它不會重復每月值,并且您的系列將通過插值進行平滑。
如果我們假設您的資料集于 1 月 1 日 00:00 開始(您沒有在問題中說明),那么命令將是
cdo inttime,1991-01-01,00:00:00,1day in.nc out.nc
這在步驟之間執行簡單的線性插值。
注意:這對于像溫度這樣的欄位很好,并且似乎是您想要的,但讀者應該注意,必須更加小心諸如降雨之類的通量欄位,其中可能需要適當地縮放和/或更改單位。
uj5u.com熱心網友回復:
我找不到 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))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429426.html
