https://github.com/pydata/xarray
https://ftp.ncep.noaa.gov/data/nccf/com/hrrr
1、讀取grib2
isobaricInhPa 氣壓座標系、垂直座標系,一般是多層高空數據
surface是地面數據
讀取會生成.idx文件,讀取報錯時記得刪除.idx文件
ds = xr.open_dataset('hrrr.t18z.wrfnatf00.grib2', engine='cfgrib', backend_kwargs={'filter_by_keys':{'stepType': 'instant', 'typeOfLevel': 'surface'}}) #地面實時數據
ds = cfgrib.open_datasets(r'hrrr.t18z.wrfnatf00.grib2') #所有數據
ds = xr.open_dataset(r'hrrr.t18z.wrfnatf00.grib2', engine='cfgrib',
backend_kwargs={'filter_by_keys': {'stepType': 'max', 'typeOfLevel': 'heightAboveGround',
'paramId': 207}}) #推薦,該讀取方式不會報錯
instant是實時的
accum是累計
[{'typeOfLevel': 'hybrid'}, {'typeOfLevel': 'depthBelowLandLayer'}, {'typeOfLevel': 'atmosphere'}, {'typeOfLevel': 'cloudTop'}, {'typeOfLevel': 'surface'}, {'typeOfLevel': 'heightAboveGround'}, {'typeOfLevel': 'pressureFromGroundLayer'}, {'typeOfLevel': 'sigmaLayer'}, {'typeOfLevel': 'meanSea'}, {'typeOfLevel': 'isobaricInhPa'}, {'typeOfLevel': 'heightAboveGroundLayer'}, {'typeOfLevel': 'unknown'}, {'typeOfLevel': 'isobaricLayer'}, {'typeOfLevel': 'cloudBase'}, {'typeOfLevel': 'nominalTop'}, {'typeOfLevel': 'adiabaticCondensation'}]
注意cfgrib該方法有問題,時間段的讀不出來,比如tp,surface,accum,Total_precipitation_surface_Mixed_intervals_Accumulation,1h累積降水與總累積降水量,僅能讀出總累積降水量
可以通過pynio讀取,僅支持linux和MacOS
import xgridio
import numpy as np
import xarray as xr
ds = xr.open_dataset(grid_path, engine='pynio',
backend_kwargs={
'format': 'grib2'}
)
all_keys: List[str] = list(ds.keys())
2、xarray.concat 拼接xarray數組
http://xarray.pydata.org/en/stable/generated/xarray.concat.html
https://programtalk.com/python-examples/xarray.concat/
data = Dataset({'foo': ('x', np.random.randn(10))})
print('data=',data)
objs = [data.isel(x=slice(5)), data.isel(x=slice(5, None))]
print('objs=',objs)
for data_vars in ['minimal', 'different', 'all', [], ['foo']]:
actual = xr.concat(objs, dim='x', data_vars=data_vars) #dim必填,沿X軸拼接
print('actual=',actual)
3、排序xarray.Dataset.sortby
#xarray.Dataset (time,level,longitude,latitude)
<class 'tuple'>: (1, 19, 281, 361)
<class 'list'>: [700, 400, 850, 800, 100, 900, 300, 950, 925, 500, 1000, 50, 250, 200, 600, 70, 150, 10, 20]
#level次序混亂,按level排序
var_xr = ds[‘t’].sortby('level')
4、截取xarray.Dataset.sel
xrData = xr.DataArray(xr.data,
coords={
'latitude': lat,
'longitude': lon,
'time': [datetime.strptime(file_time, '%Y%m%d%H%M%S')],
'level': levels
},
dims=['time', 'level', 'latitude', 'longitude'])
xrData = xrData.sel(level=[10.200]) #截取level層
xrData = xrData.sel(latitude=slice(maxlat, minlat),
longitude=slice(minlon, maxlon)) #截取經緯度範圍
獲取固定經緯度點(lon,lat)的所有數據
xrData.sel(longitude=113,latitude=23)
5、丟棄xarray.Dataset.drop_sel
與4相對
http://xarray.pydata.org/en/stable/generated/xarray.Dataset.drop_sel.html#xarray.Dataset.drop_sel
ds.drop_sel(level=[10.200]) #丟棄高度層10、200
6、獲取某個要素xarray.Dataset.filter_by_attrs
http://xarray.pydata.org/en/stable/generated/xarray.Dataset.filter_by_attrs.html#xarray.Dataset.filter_by_attrs
ds = xr.Dataset(...)
temp_attr = dict(standard_name="air_potential_temperature")
precip_attr = dict(standard_name="convective_precipitation_flux")
ds.filter_by_attrs(standard_name="convective_precipitation_flux")
Data variables:
temperature (x, y, time) float64 22.29 18.32 17.25 ... 13.1 6.688 22.36
precipitation (x, y, time) float64 7.428 6.19 4.359 ... 9.96 1.33 2.406
7、string數組*10
np.str轉np.float32然後*10然後轉np.int32(防止int8長度不夠)然後轉np.str然後取數組
levels = (dat['level'].astype('float32')*10).astype('int32').astype('str').data