这次我们来简单了解下气象数据常用的格式以及处理的工具,常用的数据格式包括普通的二进制格式、文本数据、NetCDF、HDF4/5以及GRIB1/2数据。我们可以利用编程语言例如python、matlab以及c语言,根据数据的说明文档或者相应的数据api开发文档进行读取,此外我们也可以根据提供的command命令行进行高效提取数据。
二进制文件和文本数据
气象中的二进制文件是指利用ASCII及扩展ASCII字符编写的数据或程序指令的文件,一般没有格式,用文本编辑器打开只能看到无意义的乱码,需要特定的解码说明才能使用,例如气象雷达的数据;文本数据的以记录的形式存在,每一条记录是以ASCIIVS的回车符CR(OD)加换行符LF(OA)来结束的,可以用文本编辑器查看,但也需要变量的说明文档,例如NOAA提供的ghcn以及isd数据都需要进行处理提取数据
IR000407540.dly 文本数据
IR000407540194406PRCP -9999 -9999 10 S 0 S-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 –
python
With open("IR000407540.dly") as file: lines = file.readlines() for line in lines: if (line[17:21] == "PRCP"): SID = line[0:11] YEAR_MON = line[11:17]
linux/unixcat IR000407540.dly | awk -F' ' '{print($1)}'
NetCDF(Network Common Data Form)
NetCDF数据是常用的气象和卫星数据存储的数据格式,结构形式包含维数、变量、属性和数据四个子域,公众号前几期有过利用python对netCDF数据处理的介绍,有感兴趣的同学可以关注公众号查看历史精彩文章使用python处理NetCDF格式文件,这里介绍大家利用CDO如何处理netCDF格式的文件
CDO(Climate Data Operators)是用来处理气候数据的命令行的集合,支持netCDF3/4以及Grib1/2数据格式,常用功能:
cdo info a.nc ###查看文件信息 cdo -f grb copy a.nc a.grb cdo -f nc copy a.grb a.nc ###grb和nc文件转换 cdo mergetime *nc test.nc ###合并netCDF文件 cdo -selyear,2019 -selmonth,01 -selday,25 -seltime,08:00 -remapnn,lon=121_lat=43 a.nc ###选择特定时间特定点的数据 cdo -outputtab,loa,lat,date,value a.nc > a.txt ###以表格形式江nc文件输出
#python调用cdo from cdo import * cdo=Cdo() cdo.infov(input=ifile) cdo.showlevel(input=ifile)
GRIB1和GRIB2文件
GRIB(GRIdded Binary)和GRIB2(General Regularly-distributed Information in Binary Form)是与计算机无关的压缩的二进制编码,主要用来存放数值天气分析和预报产品资料。处理grib文件的常用工具包pygrib,Grib格式数据处理有详细介绍,gribapi也自带python接口,可以通过ECMWF提供的ecCodes或cgrib安装包进行安装使用。此外利用wgrib以及wgrib2命令行工具也可以高效处理grib文件。
###wgrib2命令行 wgrib2 -d 56 a.grb2 -netcdf a.nc ###将grib文件转位nc文件 wgrib2 a.grb2 -d 1 -s -lon 249 39 -lon 255 33 ###提取过后经纬度点的数值 wgrib2 a.grb2 -set_grib_type c2 -small_grib 109:110 35:37 a_china.grb2 ###将文件裁剪到中国区域范围
###eccodes包 import eccodes import gribapi with GribFile(filename) as grib: len(grib) for msg in grib: print(msg[key_name])
###cfgrib包 import cfgrib ds = cfgrib.open_file('era5-levels-members.grib') ds.attributes['GRIB_edition']
###利用xarray和cfgrib直接读取为数组 import xarray as xr ds = xr.open_dataset('era5-levels-members.grib', engine='cfgrib')
HDF、HDF-EOS、HDF5和HDF-EOS5
HDF(Hierarchical Data Format)数据格式是一种具有自描述性、可扩展性、自我组织形的数据存储格式。HDF5数据克服了HDF4的不足,可以支持超过2G大小的文件,以及并行I/O;HDF-EOS是NASA开发专门处理EOS产品,可以有效的存储地理定位数据。HDF、HDF-EOS、HDF5和HDF-EOS5数据多用于卫星资料的存储和发布。
###读取NASA AIRS HDF-EOS2文件 from pyhdf.SD import SD, SDC # Open file. FILE_NAME = 'AIRS.2002.08.01.L3.RetStd_H031.v4.0.21.0.G06104133732.hdf' with SD(FILE_NAME, SDC.READ) as hdf: # List available SDS datasets. print(hdf.datasets()) # Read dataset. DATAFIELD_NAME='RelHumid_A' data3D = hdf.select(DATAFIELD_NAME) data = data3D[11,:,:] # Read geolocation dataset. lat = hdf.select('Latitude') latitude = lat[:,:] lon = hdf.select('Longitude') longitude = lon[:,:]
###读取 OMI L3 version 2 product HDF-EOS5的数据 import h5py FILE_NAME = 'OMI-Aura_L3-OMTO3e_2005m1214_v002-2006m0929t143855.he5' DATAFIELD_NAME = '/HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/ColumnAmountO3' with h5py.File(FILE_NAME, mode='r') as f: #List available datasets. print(f.keys()) # Read dataset. dset = f[DATAFIELD_NAME] data = dset[:]
常用气象格式的数据读取及可视化
https://code.mpimet.mpg.de/projects/cdo/wiki
https://confluence.ecmwf.int/pages/viewpage.action?pageId=7374715
https://hdfeos.org/index.php
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/212423.html