visual数据结构结构怎么读取文件_从xarray走向netCDF处理(一):数据结构及数据读取...

想如今气象数据netCDF(.nc)为盛,用者甚多,初学者见之仰天长啸,倘若再由Python经手,netCDF4-python,Iris,xarray,UV-CDAT选择众多,劳心伤神事小,逼出选择困难症事大。多番比对,选用xarray,解查安抚,化繁为简,最为称心。

说人话就是,经学前班大队长亲测利用Python中的xarray库处理nc数据非常方便。

安装

xarray的安装依旧推荐使用conda,还不会的小伙伴移步:一文教你解决Python所有安装配置

conda install xarray

在终端里输入如上命令,之后输入y,等待安装结束就好了。

数据结构

xarray有两大数据类型:DataArray、Dataset。

DataArray

一个带有标签的多维数组,它有如下几个重要的属性

  • values 获取数组的具体数值

  • dims 获取维度的名字,如('x', 'y', 'z')

  • coords 获取一个类似于字典的结果,里面包含各个坐标

  • attrs 获取原始数据的属性,比如变量的名字、单位等

Dataset

Dataset可以简单的理解为由多个DataArray组成的集合,它有如下几个重要的属性

  • dims 获取维度的名字,结果类似于字典,如{'x': 6, 'y': 6, 'time': 8}

  • data_vars 获取物理量的名字

  • coords 获取一个类似于字典的结果,里面包含各个坐标

  • attrs 获取原始数据的属性,比如变量的名字、单位等

    06f5e9d0eaa23d500e3e30722d8eccfd.png
    数据结构图示

数据类型的使用

读取数据:
  • xarray.open_dataset()读取Dataset类型数据,即能读取多个物理量。

  • xarray.open_dataarray()读取DataArray类型数据,即只能读取单个物理量。

如果nc文件中含有多个物理量,用open_dataarray()读取会报错,因此建议统一都用open_dataset()来读取文件。

提取物理量

从文件中读取数据ds = xarray.open_dataset()
假如数据中含有一个名为var的物理量可以通过ds.vards[var]来获取

实例

此处使用的是ERA-Interim中2018年的月数据,包含10米的径向风、纬向风和2米气温,在ECMWF注册过的都可以直接下载。下面代码部分建议大家横屏阅读

>>>import xarray as xr# 由于数据包含了多个物理量(u10,v10,t2m),所以要用open_dataset来读取数据>>>ds = xr.open_dataset('EC-Interim_monthly_2018.nc')# ds的类型为Dataset,里面包含u10,v10,t2m三个物理量,每个物理量都有经度、纬度、时间三个坐标系>>>dsDimensions:    (latitude: 241, longitude: 480, time: 12)Coordinates:  * longitude  (longitude) float32 0.0 0.75 1.5 2.25 .. 357.75 358.5 359.25  * latitude   (latitude) float32 90.0 89.25 88.5 87.75 .. -88.5 -89.25 -90.0  * time       (time) datetime64[ns] 2018-01-01 2018-02-01 .. 2018-12-01Data variables:    u10        (time, latitude, longitude) float32 ..    v10        (time, latitude, longitude) float32 ..    t2m        (time, latitude, longitude) float32 ..Attributes:    Conventions: CF-1.6    history:    2019-03-28 02:03:39 GMT by grib_to_netcdf-2.12.0: grib_to_n...#  取出ds中名为t2m的物理量,可以看到它的维度,坐标系,以及t2m有单位和名字两个属性>>>ds['t2m']'t2m' (time: [13e88160 values with dtype=float32]Coordinates:  * longitude  (longitude) float32 0.0 0.75 1.5 2.25 ... 357.75 358.5 359.25  * latitude   (latitude) float32 90.0 89.25 88.5 87.75 ... -88.5 -89.25 -90.0  * time      (time) datetime64[ns] 2018-01-01 2018-02-01 ... 2018-12-01Attributes:    units:     K    long_name:  2 metre temperatur

通过xarray可以清晰的了解nc数据中的维度、坐标、物理量以及各种属性等信息。清晰的数据结构是准确、高效地分析数据的基础

简单的可视化

了解完数据结构,再来看一看数据可视化的结果。xarray封装了matplotlib的部分绘图函数,一行代码就可以将数据画出来,不过作为一个负责的公众号,还是用cartopy顺带加载了地图。

import numpy as npimport xarray as xrimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERimport matplotlib.pyplot as plt# 数据读取及时间平均处理ds = xr.open_dataset('EC-Interim_monthly_2018.nc')temp = (ds['t2m'] - 273.15).mean(dim='time')  #把温度转换为℃并对其时间纬求平均temp.attrs['units'] = 'deg C'  #温度单位转换为℃# 创建画图空间proj = ccrs.PlateCarree()  #创建投影fig = plt.figure(figsize=(9,6))  #创建页面ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  #子图# 设置地图属性:加载国界、海岸线、河流、湖泊ax.add_feature(cfeat.BORDERS.with_scale('50m'), linewidth=0.8, zorder=1)ax.add_feature(cfeat.COASTLINE.with_scale('50m'), linewidth=0.6, zorder=1)  ax.add_feature(cfeat.RIVERS.with_scale('50m'), zorder=1)  ax.add_feature(cfeat.LAKES.with_scale('50m'), zorder=1)  # 设置网格点属性gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,   linewidth=1.2, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False  #关闭顶端标签gl.ylabels_right = False  #关闭右侧标签gl.xformatter = LONGITUDE_FORMATTER  #x轴设为经度格式gl.yformatter = LATITUDE_FORMATTER  #y轴设为纬度格式# 设置colorbarcbar_kwargs = {   'orientation': 'horizontal',   'label': '2m temperature (℃)',   'shrink': 0.8,   'ticks': np.arange(-30,30+5,5)}# 画图levels = np.arange(-30,30+1,1)temp.plot.contourf(ax=ax, levels=levels, cmap='Spectral_r',     cbar_kwargs=cbar_kwargs, transform=ccrs.PlateCarree())fig.show()

afa553b1f48e05e7139307958030cf9f.png

后面还有一些与nc数据相关的操作和画图,感兴趣的伙计们赶快关注我们。

本文数据

https://apps.ecmwf.int/datasets/data/interim-full-moda/levtype=sfc/

往期回顾

背向NCL,面向对象

气象数据的常用格式以及处理的工具

使用Python处理NetCDF格式文件

如何用python画图——带你入门matplotlib

如何用python画图--matplotlib实例与补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值