爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 34854|回复: 14

[其他] 求问,NCL处理含有NAN的数据

[复制链接]

新浪微博达人勋

发表于 2014-2-27 09:48:52 | 显示全部楼层 |阅读模式

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

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

x
数据是经过处理后得到的,缺测的地方用NAN来代替,有没有同学处理过,我画图的时候老不成,请了解的帮忙说一下。程序如下:
  1 ;===================================================
  2   load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
  3   load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
  4   load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
  5   begin
  6     d  = addfile("20000103Quikscatws.nc","r")
  7     wind=d->ws(:,:)
  8     printVarSummary(wind)
  9     wind@_FillValue=-32678
10     wind@units="m/s"
11     wind!0="nlat"
12     wind!1="nlon"
13     wind&nlat=d->lat
14     wind&nlon=d->lon
15     title="QuikSCATwindsp11"
16     wks=gsn_open_wks("newpdf",title)
17     gsn_define_colormap(wks,"BlAqGrYeOrReVi200")
18
19     res=True
20     res@cnFillOn=True
21     res@cnLinesOn              = False
22     res@cnLineLabelsOn         = False
23     res@gsnSpreadColors        = True
24     res@cnLevelSelectionMode   = "ManualLevels"
25     res@cnMinLevelValF          =0
26     res@cnMaxLevelValF         =30
27     res@cnLevelSpacingF        =2
28     res@mpCenterLonF=         210
29     res@mpFillOn                = False
30     res@tiMainString           = "QuickSCAT Wind Speed"     ; title
31     res@gsnLeftString             = "20000103"
32     res@gsnRightString  ="m/s"
33   ; res@gsnZonalMean     =True
34     res@cnFillDrawOrder="Postdraw"
35     plot=gsn_csm_contour_map_ce(wks,wind,res)
36  end
;======================================
数据部分如下:
;===============================

(33,163)        nan
(33,164)        nan
(33,165)        nan
(33,166)        nan
(33,167)        nan
(33,168)        nan
(33,169)        nan
(33,170)        nan
(33,171)        nan
(33,172)        nan
(33,173)        nan
(33,174)        nan
(33,175)        nan
(33,176)        nan
(33,177)        nan
(33,178)        nan
(33,179)        nan
(33,180)        3.2975
(33,181)        1.9525
(33,182)        2.6125
(33,183)        3.7025
(33,184)        3.675
(33,185)        4.1775
(33,186)        4.3425
(33,187)        4.7475
(33,188)        4.7975
(33,189)        4.4925
(33,190)        3.945
(33,191)        4.395
(33,192)        4.625
(33,193)        4.6625
(33,194)        4.5175
(33,195)        4.1475
(33,196)        4.375
(33,197)        4.19
(33,198)        4.345
(33,199)        5.2375
(33,200)        5.56
(33,201)        5.5225
(33,202)        6.2225
(33,203)        6.3975
(33,204)        6.435
;=======================
画图得到是:
111111.PNG
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-31 12:07:27 | 显示全部楼层
使用isnan_ieee函数,如果存在NaN,把他赋值为缺测值
if (any(isnan_ieee(x))) then
      value = 1.e20
      replace_ieeenan (x, value, 0)
      x@_FillValue = value
  end if
密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-4-19 16:35:21 | 显示全部楼层
mxgang 发表于 2015-12-26 16:11
师兄,我也像你一样出现了nan,也按照帖子的说法加了缺测值。但输出还是有nan。。。怎么解呢?

做个if判断就好了,
if(x(i).eq."nan")then
x(i)=x@_FillValue
end if                 
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2014-2-27 12:40:37 | 显示全部楼层
NCL中不能读取NAN 对于那些缺省值可以使用 @_FillValue=9999 (9999作为缺省值),这样绘图、处理数据一样不会对缺省值处理。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2014-2-27 14:10:45 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-10-16 11:28:20 | 显示全部楼层
houtian 发表于 2014-2-27 12:40
NCL中不能读取NAN 对于那些缺省值可以使用 @_FillValue=9999 (9999作为缺省值),这样绘图、处理数据一样不 ...

赞一个!也让我明白了@_FileValue的意思
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-26 16:11:44 | 显示全部楼层
大可 发表于 2014-2-27 14:10
谢谢啦,解决啦

师兄,我也像你一样出现了nan,也按照帖子的说法加了缺测值。但输出还是有nan。。。怎么解呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-4-20 08:59:04 | 显示全部楼层
这里是不是可以用一个where搞定啊,用if是不是显得太麻烦了
x=where(x.eq.“nan”, x, x@_FillValue)
我怎么觉得经常用有大小写的NaN呢
--------------------------------------------------------------------------------
参考:  风子  [经验总结] 10分钟入门NCL
#3.5 条件操作
arr6 = ispan(-6, 6, 1)
    arr6 = where(arr6.lt.0, arr6+256, arr6*2)  ; 将小于0的值加上256, 大于等于0的值做平方

    arr6@_FillValue = default_fillvalue(typeof(arr6))
    arr6_inv = 1. / where(arr6.ne.0, arr6, arr6@_FillValue)  ; 禁用0除

    v1 = (/(/12, 43, 18, 23/), (/84, 14, 32, 54/)/)
    v2 = (/(/99, 47, 32, 53/), (/75, 45, 54, 16/)/)
    vmin = where(v1.lt.v2, v1, v2) ; 取两数组对应元素最小值
    vmax = where(v1.gt.v2, v1, v2) ; 取两数组对应元素最大值

    where函数,相当于三元运算,第1个参数条件表达式满足时,结果等于第2个参数,不满足等于第3个参数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-3-23 10:56:56 | 显示全部楼层
xuebiz 发表于 2016-4-20 08:59
这里是不是可以用一个where搞定啊,用if是不是显得太麻烦了
x=where(x.eq.“nan”, x, x@_FillValue)
我 ...

可以用where的,不过是x=where(x.eq.“nan”, x@_FillValue,x)呢~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-5-9 20:16:31 | 显示全部楼层
D_Fora 发表于 2017-8-31 12:07
使用isnan_ieee函数,如果存在NaN,把他赋值为缺测值
if (any(isnan_ieee(x))) then
      value = 1.e2 ...

这个方法有用,感谢!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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