【发布时间】:2019-12-18 06:21:31
【问题描述】:
我已经使用 Siphon 请求了一个 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、lon、time、@987654332 @、altitude_above_msl、isobaric3、height_above_ground1),其中DIMENSION 是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]')
调用 ds.Absolute_vorticity_isobaric.metpy.time.values 和 ds.Absolute_vorticity_isobaric.metpy.vertical.values 将只返回 NumPy 数组,这正是我所寻求的。
问题
虽然上面的内容确实符合我的要求,但只运行一个变量就花了将近一分半钟的时间,而且它(我认为)不必要地对 UCAR 服务器征税。有没有什么方法可以在没有加载所有数据本身的巨大开销的情况下获得上面的输出?
【问题讨论】:
标签: python metpy python-siphon