xarray学习

https://github.com/pydata/xarray
https://ftp.ncep.noaa.gov/data/nccf/com/hrrr

1、读取grib2

https://github.com/ecmwf/cfgrib

conda install -c conda-forge cfgrib
pip install cfgrib

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

https://www.pyngl.ucar.edu/Nio.shtml
https://github.com/ncar/pynio

conda install pynio

安装失败git下载发布包

python setup.py build
python setup.py install
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)

xr_list = []
for index, row in latest_data.iterrows():
	xr_one = get_xr_data(row['file'], row['yb_time'])
	xr_list.append(xr_one)
xrData = xr.concat(xr_list, dim='time') #单时间xr合并为多时间xr

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')
rect_data.sortby('latitude', 0) #latitude倒序

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)

插值到某个经纬度点(lon,lat)的数据

xrData.interp(longitude=113,latitude=23)

1.nearest:最邻近插值法
2.zero:阶梯插值
3.slinear、linear:线性插值
4.quadratic、cubic:2、3阶B样条曲线插值

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

8、xarray.DataArray.mean

沿某些维度取平均值,同np.mean

DataArray.mean('lon') #lon轴消失,沿lon轴取平均值

9、重新分配坐标 assign_coords

data_var.assign_coords(level=data_var.level/100)

10、读取nc

ds = xr.open_dataset(f'E:\chqqh\wrf\jan_avg_wrf_d04.nc', drop_variables='z')
# 重复的要素z报错,放弃读取
学习数据科学时,下面是一个学习范围和学习计划的建议: 学习范围: 1. 编程基础:学习Python编程语言,包括语法、数据类型、函数和面向对象编程等。 2. 数据处理和分析:掌握数据处理和分析库,如NumPy、Pandas和Xarray学习数据清洗、整理、转换和探索性分析等技巧。 3. 数据可视化:学习使用Matplotlib和Seaborn等库进行数据可视化,掌握绘制各种图表和图形的方法,以便更好地理解和展示数据。 4. 统计分析:熟悉统计学基础知识和常用的统计分析方法,如假设检验、回归分析和时间序列分析等。 5. 机器学习:了解机器学习的基本概念、算法和应用,学习使用Scikit-learn等库实现常见的机器学习算法。 6. 数据挖掘:学习数据挖掘的基本概念和技术,掌握常用的数据挖掘算法和工具,如聚类、分类和关联规则挖掘等。 7. 深度学习:了解深度学习的原理和应用,学习使用TensorFlow或PyTorch等库实现深度学习模型。 8. 数据库和SQL:熟悉数据库的基本概念和SQL语言,能够使用Python连接数据库,并进行数据的读取、写入和查询等操作。 学习计划: 1. 首先学习Python编程基础,包括语法、数据类型和基本的控制流程。可以通过在线教程、书籍或视频课程进行学习。 2. 掌握数据处理和分析库,如NumPy和Pandas。可以通过练习和实际项目来熟悉这些库的使用。 3. 学习数据可视化库,如Matplotlib和Seaborn。尝试使用这些库绘制各种图表和图形,以展示数据和分析结果。 4. 理解统计学基础知识,并学习常用的统计分析方法。可以通过书籍、在线课程或统计学习资源进行学习。 5. 了解机器学习的基本概念和算法,学习使用Scikit-learn库实现机器学习模型。可以通过练习和实践项目来加深理解。 6. 学习数据挖掘和深度学习的基本概念和方法。可以通过阅读相关书籍、论文或参加在线课程来学习。 7. 熟悉数据库的基本概念和SQL语言,学习使用Python连接数据库,并进行数据的读取、写入和查询等操作。 8. 尝试实践项目,应用所学知识解决实际的数据科学问题。可以参与开源项目、竞赛或自己找到感兴趣的数据集进行分析和建模。 在学习过程中,建议结合理论学习和实践项目,通过动手实践来巩固所学的知识。同时,保持积极的学习态度,不断练习和探索新的数据科学技术和方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值