开发者社区> 问答> 正文

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

我已经使用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)
ds = xr.open_dataset(datastore).metpy.parse_cf()

将数据集的每个变量作为一个xarray。DataArray,称ds.VARIABLE.metpy。维度已经MetPy自动返回适当的坐标变量(无论它的名称是什么,例如lat、lon、time、time1、altitude_above_msl、isobaric3、height_above_ground1),其中维度是时间、垂直、x和y之一。 在本例中,ds.Absolute_vorticity_isobaric.metpy。时间返回ds。时间,ds.Absolute_vorticity_isobaric.metpy。ds.isobaric2垂直的回报。向调用中添加.values只返回numpy。ndarray与我一直试图得到的值。因此,调用ds.Absolute_vorticity_isobaric.metpy.time。值产生以下结果(以下截断):

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。价值观和ds.Absolute_vorticity_isobaric.metpy.vertical。值将只返回NumPy数组,这正是我所寻找的。 虽然上面的代码实际上做了我想做的事情,但是只运行一个变量就花费了将近一分半钟的时间,而且(我假设)它会对UCAR服务器造成不必要的负担。有没有一种方法可以在不需要加载所有数据的情况下获得上面的输出? 问题来源StackOverflow 地址:/questions/59380673/how-do-i-get-arrays-of-coordinate-values-for-a-variable-from-a-netcdf-gridded-da

展开
收起
kun坤 2019-12-28 14:10:59 1411 0
1 条回答
写回答
取消 提交回答
  • 如果您关心原始方法的性能,并且只想提取时间和垂直坐标,我建议使用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()
    
    2019-12-28 14:11:09
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
重新定义计算的边界 立即下载
二维火监控平台构建与探索 立即下载
低代码开发师(初级)实战教程 立即下载