1.首先遍历卫星数据的文件,挨个读取每个数据
def scaner_file(url):
file = os.listdir(url)
return file
2.读取数据主体代码
def read_data(url):
file = scaner_file(url)
num_count = 0 # 用来统计一下读取数据文件的个数
for f in file:
data_path = os.path.join(url,f)
dst = Dataset(data_path, mode='r', format="netCDF4")
lon = np.array(dst.variables['lon'][:]) # 经度 np.array是转化成数组
lat = np.array(dst.variables['lat'][:]) # 维度
# t2m = dst.variables['t2m'][:]
time = np.array(dst.variables['time'][:]) # 时间
alt = np.array(dst.variables['alt'][:]) # 轨道高
range_heirht = np.array(dst.variables['range_ku'][:]) # 卫星到湖面高
dry_corr = np.array(dst.variables['model_dry_tropo_corr'][:]) # 干对流层延迟
wet_corr = np.array(dst.variables['model_wet_tropo_corr'][:]) # 湿对流层延迟
iono_corr = np.array(dst.variables['iono_corr_alt_ku'][:]) # 电离层延迟
solid_tide_corr = np.array(dst.variables['solid_earth_tide'][:]) # 地球固体潮改正
pole_tide_corr = np.array(dst.variables['pole_tide'][:]) # 极潮改正
3.进行下一步,筛选在研究区域的数据
B_lon,B_lat = read_boundary()
# 调用函数Inpolygon 判断在指定区域内或边界上的点,其中_in指明在内或边缘上的点,_on指明在边缘上的点。
_in,_on = Inpolygon.inpolygon(lon,lat,B_lon,B_lat)
# 用逻辑语句,判断是否完全在内部的点
_in_not_on = _in & ~_on
def get_in_range(list = None,item = ''):
"""
作用是:返回在列表中完全在区域内部的点的索引号,返回的是一个列表
"""
return [i for i in range(len(_in)) if list[i] == item]
in_range_index = get_in_range(_in_not_on,1)
def rest_in_range_data(l_data,l_in_index):
"""
作用:利用在区域内部的数据,列表。
"""
return [l_data[i] for i in l_in_index]
lon_in = rest_in_range_data(lon,in_range_index)
4.进行粗差的如NaN值,还有进行3倍方差进行对粗差处理。
h_mean = s_h.mean() # 均值
h_std = s_h.std() # 标准差
statisticii = [] # 用来存放粗差的位置
elim_index = 0 # 记录粗差位置
for i in range(len(s_h)):
if abs(s_h[i] - h_mean) > 3 * h_std:
elim_index += 1
statisticii.append(i)
4.进行按天求平均和按月求平均
5.在python处理结果如下,最大的优点就是比matlab快30-40倍
有问题,请各位读者及时告知,一起完善内容。