如何使用虹吸和MetPy从netCDF网格数据集中获取变量的坐标值数组?

2024-06-01 12:32:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用虹吸请求了一个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

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

从组成元素xarray.DataArray

获取坐标轴

对于作为xarray.DataArray的数据集的每个变量,调用ds.VARIABLE.metpy.DIMENSION使MetPy自动返回适当的坐标变量(不管它叫什么,例如latlontimetime1altitude_above_mslisobaric3height_above_ground1),其中DIMENSIONtimeverticalxy之一。你知道吗

获取值

在本例中,ds.Absolute_vorticity_isobaric.metpy.time返回ds.timeds.Absolute_vorticity_isobaric.metpy.vertical返回ds.isobaric2。将.values添加到调用只返回numpy.ndarray,其中包含我一直试图获取的值。因此,调用ds.Absolute_vorticity_isobaric.metpy.time.values会产生以下结果(在下面被截断):

array(['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]')

调用ds.Absolute_vorticity_isobaric.metpy.time.valuesds.Absolute_vorticity_isobaric.metpy.vertical.values将只返回NumPy数组,这就是我要寻找的。

问题

虽然上面的代码确实满足了我的要求,但只运行一个变量就花了将近一分半钟,而且(我假设)对UCAR服务器不必要地征税。有没有任何方法可以在不加载所有数据本身的巨大开销的情况下获得上述输出?你知道吗


Tags: 数据方法datatimedsquerycatalogxarray
1条回答
网友
1楼 · 发布于 2024-06-01 12:32:41

如果您关心原始方法的性能,并且只希望提取时间和垂直坐标,我建议使用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()

相关问题 更多 >