微雨雷达可测量其上空垂直剖面高达数公里范围内的雨强、雨滴谱、粒径分布、雷达反射率、雨滴降落速度及其他降雨相关特性。其有三类数据,分别为raw原始谱数据、ave平均数据以及pro处理数据,为了避免重复造轮子,先google搜索相关的解决方法。
发现mrr2c库可以将微雨雷达文件的格式由ascii型转换为netCDF格式,这个倒是方便进行后续操作,由于已有成熟的netCDF库包,后续的处理会很方便。然而用自己的文件进行测试出现了错误 。测试代码比较简单,放在下面:
import mrr2c
import numpy as np
import netCDF4
a=mrr2c.mrr2c('MRR20210727.raw')
print(a.keys())
如果要纠正这个错误又要折腾半天,估计是我用的数据格式之类的原因。于是舍弃这个方法。
查看IMProToo库包的具体信息,链接,Too: Improved Mrr Processing Tool,发现这个库的功能更加全面,也包括了数据格式的转换,但是输入的数据只能是原始raw数据并根据原始数据处理出ave和pro数据,对于微雨雷达的average和pro产品数据,则需要自己进行读取处理了。
简单的代码验证
import IMProToo
#原始数据读取
rawdata=IMProToo.mrrRawData(r'F:ActDataRawSpectra.raw')
#pro数据
processedSpec=IMProToo.MrrZe(rawdata)
#ave数据
processedSpec.averageSpectra(60)
#processedSpec.averageSpectra(120)
#转换为netCDF格式
processedSpec.writeNetCDF('filename',ncForm='NETCDF3_CLASSIC')
读取微雨雷达的pro产品数据,只能自己撸代码。观察数据的特征
一个时次是由MRR开头的表头,以及后续的各变量组成,格式为ascii,可直接用open()命令进行读取,以反射率因子的读取为例,进行提取保存
def mkdir(path):
import os
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
else:
print('该文件夹存在')
filepath=r'F:ActDataProcessedData.pro'
savepath='F:\MRR\'
def extract_Z(filepath,savepath):
filepath1=filepath
name = filepath1[34:40]
date = filepath1[43:45]
resultfile = savepath
mkdir(resultfile)
f2 = open(resultfile + name + date + '.txt', 'w')
mrrpro_file = open(filepath, mode='r')
txt1 = mrrpro_file.readlines() # 按行读取保存到一个列表中
for line in txt1:
if line.startwith('Z') :
f2.write(line)
f2.close()
mrrpro_file.close()
extract_Z(filepath,savepath)
此时保存的仍是str格式的数据,需要进一步处理成数组
import numpy as np
pp=r'F:MRR20210920210905Z.txt'
file=open(pp,mode='r')
def to_list(string):
a=string
b = []
for i in range(31):#根据数据特点,一个数据所占的长度为7
m = a[3 + i * 7:10 + i * 7]
if m == ' ':
m = np.nan
b.append(m)
else:
m=m.strip()
b.append(m)
return b
result=[]
a=file.readlines()
for line in a:
s=to_list(line)
result.append(s)
for i in range(len(result)):
if len(result[i][:])==31:
pass
else:
print(i,result[i][:])
for i in range(len(result)):
for j in range(31):
try:
if result[i][j]==np.nan:
pass
else:
result[i][j]=float(result[i][j])
except ValueError:#去除换行导致的错误
result[i][j]=np.nan
result=np.array(result)
至此大功告成,其他量的读取方法类似。
总结一下,处理不熟悉的数据时,善于借助网络上的资源,基本可以解决大部分问题,且节省时间。处理文件类型的步骤也大同小异,需要多学习积累。



