xarray學習

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章