Запрос OpeNDAP через Python xarray случайно завершается с «NetCDF: файл не найден» - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь загрузить данные из набора океанических данных Navy HYCOM GLBy0.08-latest (см. Каталог здесь ), используя пакет Python xarray. В зависимости от времени суток, но без видимой причины, происходит сбой с сообщением об ошибке

packages/xarray/backends/common.py", line 55, in robust_getitem
    return array[key]
  File "netCDF4/_netCDF4.pyx", line 4119, in netCDF4._netCDF4.Variable.__getitem__
  File "netCDF4/_netCDF4.pyx", line 5036, in netCDF4._netCDF4.Variable._get
  File "netCDF4/_netCDF4.pyx", line 1754, in netCDF4._netCDF4._ensure_nc_success
RuntimeError: NetCDF: file not found

. Трассировка не очень полезна, так как она потенциально поднимается в некоторой библиотеке C более низкого уровня. Если я исключу отметки времени, которые были в прошлом (т.е. не прогнозировались), запросы выполняются успешно. Вот минимальный рабочий пример в Python 3, который иногда завершается успешно, а иногда завершается с ошибкой выше:

from datetime import datetime, time
import pytz
import pandas as pd
import xarray as xr

# Use coordinates on the supported data grid
lat, lon = -42.68000030517578, 286.96002197265625

# Open the GLBy0.08-latest + forecast data set
ds = xr.open_dataset(
    'http://tds.hycom.org/thredds/dodsC/GLBy0.08/latest',
    decode_times=False)[dict(tau_0=0)]

# Set time interval of interest to be all times today in UTC
today = datetime.now().date()

t_i = datetime.combine(today, time(0, 0, 0)).astimezone(pytz.utc)
t_f = datetime.combine(today, time(23, 0, 0)).astimezone(pytz.utc)
print(f'Querying for time interval: ({t_i}, {t_f})')

# Figure out the starting timestamp of the time coordinate
t_ds_start = pd.Timestamp(ds.time.attrs['units'][12:]).to_pydatetime()
print('Dataset start time:', t_ds_start)

assert t_i > t_ds_start

# Convert these timestamps to hour offsets from dataset start time
t_i_val = (t_i-t_ds_start).total_seconds() / 3600.
t_f_val = (t_f-t_ds_start).total_seconds() / 3600.
print(f'Querying for hour offsets: ({t_i_val}, {t_f_val})')

# Get data subset
ds_sub = ds.sel(lat=lat,
                lon=lon,
                depth=slice(0., 25., None),
                time=slice(t_i_val, t_f_val, None))

# Start actual data acquisition by converting to data frame
df = ds_sub.to_dataframe()

Любая помощь о том, как это исправить или почему это происходит, приветствуется! Если это интересно, вот вывод pd.show_versions() для моей установки:

------------------
commit: None
python: 3.6.7.final.0
python-bits: 64
OS: Linux
OS-release: 5.0.0-27-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

pandas: 0.23.4
pytest: 4.1.1
pip: 19.3
setuptools: 40.8.0
Cython: 0.29.5
numpy: 1.16.1
scipy: 1.2.0
pyarrow: None
xarray: 0.11.3
IPython: 7.2.0
sphinx: None
patsy: None
dateutil: 2.8.0
pytz: 2015.7
blosc: None
bottleneck: None
tables: 3.4.4
numexpr: 2.6.9
feather: None
matplotlib: 3.0.2
openpyxl: 2.6.2
xlrd: 1.2.0
xlwt: None
xlsxwriter: None
lxml: 4.3.1
bs4: None
html5lib: None
sqlalchemy: 1.2.16
pymysql: None
psycopg2: 2.7.6.1 (dt dec pq3 ext lo64)
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: 0.9.0
pandas_datareader: None```

Thanks.

...