爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6361|回复: 11

[求助] 关于 空值 的处理

[复制链接]

新浪微博达人勋

发表于 2012-5-5 17:59:58 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 cnphoenix 于 2012-5-5 18:00 编辑

在处理数据中,遇到很多空值,从下载的数据都将空值设成一个固定值,如32766.
想问一下:
(1)fortran中能否将一个数值型变量设成空值?如果行,怎么设置?

real :: buffer =32766.
if ( buffer = 32766. ) buffer=????   !----------用什么东西表示空值呢?

(2)在进行插值时,如7点埃特米特插值时,在向插值函数传递7个点的数组数据中,如何能够识别并保证传递的7个点不含有空值(或32766)呢?有什么好的解决这个问题的思路吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-5-5 20:12:28 | 显示全部楼层
(1):fortran里面暂时貌似没有“空”的概念,一般空用字符NAN标示,其意义在于没有东西。但仿佛并不能满足你的要求。往往数据中用32766表示“缺测”!

(2):插值的时候不知道你用什么软件插值的,如果是fortran程序插值,只需要在进行插值运算前做一次判断,如果不等于该值则进行运算,否则不运算。或者干脆去掉缺测点,用剩下来的数据进行插值。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-5 20:30:54 | 显示全部楼层
本帖最后由 cnphoenix 于 2012-5-5 20:34 编辑

我已经根据观测点的观测数据的情况,删去了一些观测点,大约留下了近600个观测点,这些点大部分数据都有。
如果直接删除观测点的话,我怕要删除的点太多,可用的观测点太少。

我是想用fortran进行插值,按照插值函数,需要插值地方,要输入邻近几日的数据,组成数组传递到插值函数中去。
现在问题就是,由于空值分布没有规律,无法识别邻近的这几日数据中是否也含有空值?或含有多少个空值?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-5 23:49:08 | 显示全部楼层
你做的是什么插值,往插值函数中传递的参数是什么,能否完整介绍下你的过程
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-5 23:51:24 | 显示全部楼层
你的插值是空间的还是时间的,临近几日的数据是用来做什么的呢,了解这些才能让别人进一步和你一起想
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-6 08:53:30 | 显示全部楼层
想做时间的插值,用邻近几日非空的数据,插值得到原本是空值的数据
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-6 10:20:43 | 显示全部楼层
那你的插值算法已经完成了没有,大概是个什么思路,比如是去前后几天加权重还是什么
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-6 11:28:39 | 显示全部楼层
本帖最后由 cnphoenix 于 2012-5-6 11:29 编辑

插值函数准备用拉格朗日法插值,准备取前后邻近的5个非空的时间点
插值函数文件用《Visual Fortran常用数值算法集》(何光渝)书上提供插值函数文件

设想的大致思路是:
1.找到要需要插值的地方,即原始数据中为32766值的地方
2.前后找邻近的5个非空的时间点,组成数组xa(时间),ya(数据)
3.调用拉格朗日插值算法,传递数组xa,ya,得到插值结果
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-5-6 11:34:11 | 显示全部楼层

现在遇到的问题是:
由于文件中的空值的分布和数量没有规律,可能在文件开头,也可能紧挨着需要插值的地方,而且还可能有多个(至少在理论上可能存在),因此,在找前后找5个邻近非空的时间点时,不知道怎么找。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-5-6 11:41:18 | 显示全部楼层
我不知道你原始数据的格式时什么样子的,你看看这样行不行,先把你的资料补齐,没有数据的(你说的为空)用缺测值代替,比如32766,具体的方法你可以参考我在这个帖子里面的回复:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=6951
补全数据后,先把数据读入一个数组
然后从第一个时间开始,依次判断是否为缺测,如果为缺测,就往前后查找N个时次,查找的时候判断是否为缺测,如果是缺测就跳过(或者你有其他方法),这里你要想好如果前后数据不足N个怎么办,比如开头几个和最后几个数据的处理。找到不为缺测的数据后就可以调用插值了,由于是从前往后,所以可以保证后面的数据调用时,N/2个数据之前的已经全部不是缺测了。
按照你的思路这样应该可以,不过,这样做是否有意义呢,精度应该会很低吧,你的逐日数据的话,可能前后几个数据并不是同一个天气系统的影响。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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