我已经使用虹吸管请求了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} },lon
,time
,time1
,altitude_above_msl
,isobaric3
),其中height_above_ground1
是DIMENSION
,{{ 1}},time
和vertical
。
获取值
在这种情况下,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.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]')
只会返回NumPy数组,这正是我要寻找的。 strong>
问题
尽管以上内容确实可以实现我想要的功能,但是运行仅一个变量却花了将近一分半钟,并且(我认为)不必要地给UCAR服务器加了税。有没有什么方法可以使输出达到上面的水平,而又不会加载所有数据本身呢?