爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6018|回复: 0

格点数据算spei出错。请大神求助。

[复制链接]

新浪微博达人勋

发表于 2020-12-21 20:44:23 | 显示全部楼层 |阅读模式
NCL
系统平台:
问题截图: -
问题概况: 算格点spei问题
我看过提问的智慧: 看过
自己思考时长(天): 3

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
有大神做过格点的spei吗?求代码。R官网只有一条序列的例子,我改成格点的但失败了。(其中能算出来pet和BAL),但是最后一步用spei函数算出来的都是缺测NA。我的代码如下:
setwd("D:/T_model/pet")
rm(list = ls())
library(lmomco)
library(SPEI)
library(scPDSI)
library(ncdf4)
library(plyr)
library(data.table)
library(tcltk)
diri1 <- "D:/T_model/pet/apt1400-2000.nc"
diri2 <- "D:/T_model/pet/cnz1400-2000.nc"
diri3 <- "D:/T_model/pet/cntsun1400-2000.nc"
diri4 <- "D:/T_model/pet/cnu1400-2000.nc"
diri5 <- "D:/T_model/pet/PM_PET-NorESM-1400-2000.nc"
diri6 <- "D:/T_model/pet/PM_BAL-NorESM-1400-2000.nc"
#diri1 <- "D:/T_model/pet/pr_1400-2000.nc"
#diri2 <- "D:/T_model/pet/t_1400-2000.nc"
#diri3 <- "D:/T_model/pet/tsun.nc"
#diri4 <- "D:/T_model/pet/z.nc"
#diri5 <- "D:/T_model/pet/AWND1000_1400-2000.nc"
##diri2 <- "D:/re-cmip5/past1000/FGOALS-gl/pr_Amon_FGOALS-gl_past1000_r1i1p1_160001-179912.nc"
#f1 <- nc_open(diri1)
#f2 <- nc_open(diri2)
#f3 <- nc_open(diri3)
#f4 <- nc_open(diri4)
#f5 <- nc_open(diri5)
##f2 <- nc_open(diri2)
f1 <- nc_open(diri1)
f2 <- nc_open(diri2)
f3 <- nc_open(diri3)
f4 <- nc_open(diri4)
f5 <- nc_open(diri5)
f6 <- nc_open(diri6)
#tmin <- ncvar_get(f2, varid = "tmin")
#tmin1 <- tmin-273.15
#tmax <- ncvar_get(f2, varid = "tmax")
#tmax1 <- tmax-273.15
#Tsun <- ncvar_get(f3, varid = "tsun")
#tsun1 <- Tsun*30.41
#z <- ncvar_get(f4, varid = "z")
#AWND <- ncvar_get(f5, varid = "AWND")
#pr <- ncvar_get(f1, varid = "pr")
#pp <- pr*24*30*3600
#pr1 <- pp*1000
tmin <- ncvar_get(f1, varid = "tmin")
tmin1 <- tmin-273.15
tmax <- ncvar_get(f1, varid = "tmax")
tmax1 <- tmax-273.15
z <- ncvar_get(f2, varid = "z")
Tsun <- ncvar_get(f3, varid = "tsun")
tsun1 <- Tsun*30.41
u2 <- ncvar_get(f4, varid = "u2")
AWND <- u2*3.6
pet <- ncvar_get(f5, varid = "pet")
BAL <- ncvar_get(f6, varid = "BAL")
pr <- ncvar_get(f1, varid = "pr")
pp <- pr*24*30*3600
pr1 <- pp*1000
##get the dimension
###close file and useless variables
lon <- ncvar_get(f1, varid = "lon")
lat <- ncvar_get(f1, varid = "lat")
##nc_close(f2)
rm(tmin)
rm(tmax)
rm(Tsun)
rm(u2)
rm(pr)
rm(pp)

###define time and empty array
time <- seq(from = as.Date("1400-02-01"), to = as.Date("2001-01-01"), by = "month")
time <- strsplit(as.character(time), split = "-")
time <- as.numeric(paste0(sapply(time, "[", 1), sapply(time, "[", 2)))
nlon <- length(lon)
nlat <- length(lat)
ntime <- length(time)
dd <- data.frame(time = numeric(), lat = numeric(), lon = numeric(), SPEI = numeric())
ds <- data.frame(time = time,
                 lat  = rep(NA, ntime),
                 lon  = rep(NA, ntime),
                 SPEI = rep(NA, ntime))
pb <- tkProgressBar(title = "cal-PDSI 1.0", label = "It has completed  %", min = 0, max = 100)

for (i in 1:nlat) {
  for (j in 1:nlon) {
    ds[, "lat"] <- lat[i]
    ds[, "lon"] <- lon[j]

    ds[, "SPEI"] <- tryCatch({
      as.numberic(spei(BAL[1,i,], 12))
    }, error = function(e) return(NA))
    dd <- rbind(dd, ds) # merge file
    info <- sprintf("It has completed %d%%", round(i*100/nlat))
    setTkProgressBar(pb, value = i*100/nlat, label = info)
  }
}
close(pb)
dd <- plyr::arrange(dd, time, lat, lon)
dd[is.na(dd$SPEI), "SPEI"] <- -999.9

lon <- ncvar_get(f1, varid = "lon")
lat <- ncvar_get(f1, varid = "lat")
#time <- ncvar_get(f1, varid = "time")
nc_close(f1)
lon <- ncdim_def(name = "lon",   units = "degreesE", vals = lon, longname = "Longitude_East")
lat <- ncdim_def(name = "lat",   units = "degreesN", vals = lat, longname = "Latitude_North")
time <- ncdim_def(name = "time", units = "days since 1001-01-01",
                  vals = time, unlim = TRUE, calendar = "noleap")
# define variables
indices <- ncvar_def(name = "SPEI", units = "", dim = list(lon, lat, time), missval = -999.9)
# open/create .nc file

ncnew <- nc_create(filename = "PM_SPEI-1400-2000.nc", vars = indices, force_v4 = TRUE)
ncvar_put(ncnew, varid = "SPEI", vals = dd$SPEI)
nc_close(ncnew)



密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表