Почему у клавиши xarray reftime внезапно появляется 1 в конце? - PullRequest
1 голос
/ 30 марта 2020

Я загружаю данные GFS с сервера Unidata Thredds с помощью сифона, чтобы я мог построить их с помощью MetPy. Я написал сценарий для этого, и он отлично работал вчера:

#Get data using siphon
best_gfs = TDSCatalog('http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_0p25deg/catalog.xml?dataset=grib/NCEP/GFS/Global_0p25deg/Best')
best_ds = best_gfs.datasets[0]
ncss = best_ds.subset()
query = ncss.query()
query.lonlat_box(north=55, south=20, east=-60, west=-120).time(datetime.utcnow())
query.accept('netcdf4')
query.variables('Geopotential_height_isobaric')

data = ncss.get_data(query)

#Parse data using MetPy
ds = xr.open_dataset(NetCDF4DataStore(data))
data = ds.metpy.parse_cf()

time_of_run = data['reftime'][0].dt.strftime('%Y%m%d_%H%MZ').values
print(time_of_run)

Когда я запускал его около 14:00 по восточному поясному времени, этот код выводил 2020-03-29 12: 00Z, и все было хорошо.

Когда я запустил его этим утром, я получил ошибку:

Traceback (most recent call last):
  File "C:\Users\jacks\Anaconda3\envs\metpy_test\lib\site-packages\xarray\core\dataset.py", line 1155, in _construct_dataarray
    variable = self._variables[name]
KeyError: 'reftime'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "h5_rh_wind_gph_temp.py", line 51, in <module>
    time_of_run = data['reftime'][0].dt.strftime('%Y%m%d_%H%MZ').values
  File "C:\Users\jacks\Anaconda3\envs\metpy_test\lib\site-packages\xarray\core\dataset.py", line 1245, in __getitem__
    return self._construct_dataarray(key)
  File "C:\Users\jacks\Anaconda3\envs\metpy_test\lib\site-packages\xarray\core\dataset.py", line 1158, in _construct_dataarray
    self._variables, name, self._level_coords, self.dims
  File "C:\Users\jacks\Anaconda3\envs\metpy_test\lib\site-packages\xarray\core\dataset.py", line 165, in _get_virtual_variable
    ref_var = variables[ref_name]
KeyError: 'reftime'

, которая говорит о том, что ссылка на ключ 'reftime' недействительна. Чтобы исследовать, я затем напечатал xarray «data»:

<xarray.Dataset>
Dimensions:                       (isobaric6: 34, lat: 141, lon: 241, time1: 1)
Coordinates:
    reftime1                      (time1) datetime64[ns] ...
  * time1                         (time1) datetime64[ns] 2020-03-30T12:00:00
  * isobaric6                     (isobaric6) float32 40.0 100.0 ... 100000.0
  * lat                           (lat) float32 55.0 54.75 54.5 ... 20.25 20.0
  * lon                           (lon) float32 240.0 240.25 ... 299.75 300.0
    crs                           object Projection: latitude_longitude
Data variables:
    Geopotential_height_isobaric  (time1, isobaric6, lat, lon) float32 ...
    LatLon_Projection             int32 ...
Attributes:
    Originating_or_generating_Center:                                        ...
    Originating_or_generating_Subcenter:                                     ...
    GRIB_table_version:                                                      ...
    Type_of_generating_process:                                              ...
    Analysis_or_forecast_generating_process_identifier_defined_by_originating...
    Conventions:                                                             ...
    history:                                                                 ...
    featureType:                                                             ...
    History:                                                                 ...
    geospatial_lat_min:                                                      ...
    geospatial_lat_max:                                                      ...
    geospatial_lon_min:                                                      ...
    geospatial_lon_max:                                                      ...

, который указывает, что информация, которую я хочу (время выполнения модели), теперь хранится как «reftime1». Почему это 1 внезапно появляется в конце ключа reftime? Происходит ли его появление с какой-либо регулярностью? Я надеюсь в итоге запустить этот скрипт как задание cron для автоматического создания графиков, поэтому было бы неплохо найти способ либо предвидеть это изменение имени, либо полностью обойти имя ключа.

1 Ответ

1 голос
/ 30 марта 2020

Изменение с reftime на reftime1 происходит от того, как THREDDS и netCDF- java обрабатывают создание представления netCDF базовых данных GRIB. GRIB в основном прибывают как отдельные 2D срезы данных. Чтобы создать время, время возврата и различные вертикальные измерения, netCDF- java просматривает набор сообщений GRIB, доступных для данного поля (например, Geopotential_height_isobaric). Если поля имеют разные наборы времен / вертикальных размеров, то отдельные измерения создаются с уникальными именами, например reftime, reftime1, reftime2. Какое поле заканчивается, какое имя измерения зависит от порядка, в котором netCDF- java встречает конкретное сообщение GRIB в коллекции.

Способ работы с этим состоит в том, чтобы избежать зависимости от имен, но вместо этого используйте метаданные, чтобы выяснить, что вы ищете. MetPy может сделать это, предоставив вам соответствующие псевдонимы для различных измерений / координат:

# Will point to appropriate time1, time2, etc.
time = data.Geopotential_height_isobaric.metpy.time

Это работает для координат для определенной переменной. В случае reftime, поскольку это не координата для переменной, вы также можете найти это, посмотрев стандартное имя метаданных Climate and Forecasting (CF) для forecast_reference_time:

filtered_ds = data_.filter_by_attrs(standard_name='forecast_reference_time')

Это все еще оставляет xarray Dataset, который вам нужен, чтобы найти какой-то способ извлечь единственную переменную внутри - я не уверен, что лучший путь к go оттуда есть.

...