python处理smap level2c 数据---根据 iqc_flag进行数据质量控制(二进制&十进制)

python 处理SMAP_level2c数据进行质量控制


最近在处理SMAP_level2c_sss数据时,再进行偏差估计时发现数据存在问题,根据卫星图像对比,发现在数据筛选之前未进行质量控制,因此有较大的问题。再次,进行一定的总结:

一、二进制与十进制

在此之前,先让我们简单了解一下基础知识吧~

什么是二进制?

二进制是计算机中广泛采用的一种算法。二进制数据是用0和1两个数码来表示的数,所以显示出来的数只有0、1。进位规则是“逢二进一”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。
计算机内部表示数的字节单位是定长的,如8位,16位,或32位。
八位就是:0000 0000
其他类推
假如按照4位二进制的数进行转换,先看一张表格对比一下:
在这里插入图片描述不难看出其规律:按照从右向左排序的方式,十进制转为二进制时依次为
在这里插入图片描述

举个栗子,
在这里插入图片描述
所以转换后就应该是:0101

这样说是不是一下子就明白了呐~~

还是不理解的自己上网看看视频就行啦~~

二、位运算符

在python中,位运算按照数据在内存中的二进制位(Bit)进行操作,同时, 位运算符只能用来操作整数类型,按照整数在内存中的二进制形式进行计算。具体的位运算符如下表所示:
在这里插入图片描述简单来说,将两个十进制数进行比较,假如有4位二进制数
0000

a&b的意思是:a、b中对应的二进制位数进行比较,两个位都为 1 时,结果才为 1,否则为 0。

举个例子:

a=4 #二进制为:0100
b=5 #二进制为:0101
c=a&b      #既二进制对应比较 0100 
                       #  0101 
#同时为1,则对应位数显示为1,否则为0
#对应结果应该是:0100

最终显示的是十进位的结果!
在这里插入图片描述同理,其他的就好明白啦~
a|b:
两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0

a^b:
参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。

“~” :
对参与运算的二进制位取反 .如~ 1为0,~0为1

<<:
将各个二进制位全部左移若干位,高位丢弃,低位补 0。由 << 右边的数字指定了移动的位数。

“>>”:
将左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数

三、如何进行位运算

下面针对我的smap盐度数据进行处理,通过查阅手册得知我的qc_flag为32 bit(位数)
在这里插入图片描述在这里插入图片描述
每一位都表示一定的误差,当位数为0时,表示无表中体现的误差,位数为1时,有表中体现的误差。
简单来说,qc_flag中有1就说明,32 bit中有一位对应着一定的问题,可能是:陆地污染、风俗太大、银河辐射等等、、、

知道每一位对应的问题,我们再进行质量控制时,即可按需对比,比如我们想要风速小的数据,只有筛选(表中第12位)的数据是0的数据。

ok,下面打开nc文件中的iqc_flag,它告诉了我们如何比较你想要的位数:
在这里插入图片描述在这里插入图片描述打开发现,这些数字都是2的几次方(十进制数),这就告诉我们:
如果你想比较数据的第一位(时,将数据与1进行 & 比较
如果想比较第 8 bit ,将数据与256 进行比较 & 即可

import numpy as np
import netCDF4 as nc
filename ='G:\\SMAP\\01\\RSS_SMAP_SSS_L2C_r26542_20200120T090520_2020020_FNL_V04.0.nc'
f1 = nc.Dataset(filename)#
sss_smap_40km = f1.variables['sss_smap_40km'][:].data
sss_flg=f1.variables['iqc_flag'][:].data
#==========================================================
sss=np.array(sss_smap_40km[:,:,0])
qc=np.array(sss_flg[:,:,0])
# 比较第一位 bit
result=(qc&1)
# 取出质量控制之后的sss
sss_result=sss[result]
# 比较第八位 bit
result1=(qc&256)

在这里插入图片描述

当然,一般来说,我们肯定只想要最好的数据(没有上述表中所说明的问题),既 32 bit 中每一位都是0的数据,这样子就很简单啦

直接令所有的qc数据值等于0,再取出需要的数据即可:

import numpy as np
import netCDF4 as nc
filename ='G:\\SMAP\\01\\RSS_SMAP_SSS_L2C_r26542_20200120T090520_2020020_FNL_V04.0.nc'
f1 = nc.Dataset(filename)#
sss_smap_40km = f1.variables['sss_smap_40km'][:].data
sss_flg=f1.variables['iqc_flag'][:].data
#==========================================================
sss=np.array(sss_smap_40km[:,:,0])
qc=np.array(sss_flg[:,:,0])
# 比较第一位 bit
result=(qc==0)
# 取出质量控制之后的sss
sss_result=sss[result]


在这里插入图片描述
下面再进行你需要的处理(取出无效值)就可以啦~~

		                            
                           一个努力学习python的海洋小白
                            水平有限,欢迎指正!!!
                            欢迎评论、收藏。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值