如何使用Siphon和MetPy从netCDF网格化数据集中获取变量的坐标值数组? 获取数据使用MetPy's xarray accessor作为xarray.Dataset获取数据从组成xarray.DataArray中获取坐标轴获取值

我已经使用虹吸管请求了netCDF子集,并形成了一个查询来检索边界框中的变量:

from siphon.catalog import TDSCatalog
cat = TDSCatalog("https://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_onedeg/catalog.xml?dataset=grib/NCEP/GFS/Global_onedeg/Best")
ncss = cat.datasets[0].subset()
query = ncss.query()
query.variables("Absolute_vorticity_isobaric")
query.lonlat_box(north=34.,south=33.,west=-102.,east=-101.)
query.accept("netcdf4")

我正在寻找一种可靠,简洁的方法来获取该变量的坐标值,特别是时间和垂直水平。一种可行但不切实际的方法是请求并使用整个数据集。

功能性但不切实际的方法

获取数据

import xarray as xr
query.all_times()
data = ncss.get_data(query)
datastore = xr.backends.NetCDF4DataStore(data)

使用MetPy's xarray accessor作为xarray.Dataset获取数据

ds = xr.open_dataset(datastore).metpy.parse_cf()

从组成xarray.DataArray中获取坐标轴

对于作为xarray.DataArray的数据集的每个变量,调用ds.VARIABLE.metpy.DIMENSION都会使MetPy自动返回适当的坐标变量(无论其名称如何,例如lat,{{1} },lontimetime1altitude_above_mslisobaric3),其中height_above_ground1DIMENSION,{{ 1}},timevertical

获取值

在这种情况下,x返回y,而ds.Absolute_vorticity_isobaric.metpy.time返回ds.time。将ds.Absolute_vorticity_isobaric.metpy.vertical添加到调用中只会返回ds.isobaric2,其中包含我一直尝试获取的值。因此,调用.values会产生以下内容(在下面被截断):

numpy.ndarray

调用ds.Absolute_vorticity_isobaric.metpy.time.valuesarray(['2019-11-17T00:00:00.000000000','2019-11-17T03:00:00.000000000','2019-11-17T06:00:00.000000000',...,'2020-01-02T06:00:00.000000000','2020-01-02T09:00:00.000000000','2020-01-02T12:00:00.000000000'],dtype='datetime64[ns]') 只会返回NumPy数组,这正是我要寻找的。​​ strong>

问题

尽管以上内容确实可以实现我想要的功能,但是运行仅一个变量却花了将近一分半钟,并且(我认为)不必要地给UCAR服务器加了税。有没有什么方法可以使输出达到上面的水平,而又不会加载所有数据本身呢?

gh88186024 回答:如何使用Siphon和MetPy从netCDF网格化数据集中获取变量的坐标值数组? 获取数据使用MetPy's xarray accessor作为xarray.Dataset获取数据从组成xarray.DataArray中获取坐标轴获取值

如果您担心原始方法的性能,并且只希望提取时间和垂直坐标,我建议您使用OPENDAP而不是NCSS来访问数据。首先,这将简单地获取元数据,然后延迟加载您请求的数据(在您的情况下为时间和垂直坐标)。使用MetPy v0.11或更高版本,使用您感兴趣的TDS目录的示例脚本将类似于以下内容:

import metpy
import xarray as xr

from siphon.catalog import TDSCatalog

cat = TDSCatalog("https://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_onedeg/catalog.xml?dataset=grib/NCEP/GFS/Global_onedeg/Best")
opendap_url = cat.datasets[0].access_urls['OPENDAP']
ds = xr.open_dataset(opendap_url)

time = ds['Absolute_vorticity_isobaric'].metpy.time.values
vertical = ds['Absolute_vorticity_isobaric'].metpy.vertical.values

print(time)
print(vertical)

这大约需要半秒钟才能在我的系统上运行。

如果您的MetPy早于v0.11,则在打开数据集时需要使用.metpy.parse_cf(),如下所示:

ds = xr.open_dataset(opendap_url).metpy.parse_cf()
本文链接:https://www.f2er.com/2903846.html

大家都在问