Я думаю, что у меня есть решение сейчас. По какой-то причине данные этих запросов UNIDATA D CSS иногда возвращают байты с прямым порядком байтов. Это несовместимо с объектом Pandas Dataframe или Series, как обсуждено здесь . Я нашел функцию в PVLIB, которая берет данные из NetCDF4 и создает Pandas Dataframe. Загляните внутрь pvlib
, затем forecast.py
и функция называется _netcdf2pandas
. Я скопирую исходный код ниже:
data_dict = {}
for key, data in netcdf_data.variables.items():
# if accounts for possibility of extra variable returned
if key not in query_variables:
continue
squeezed = data[:].squeeze()
if squeezed.ndim == 1:
data_dict[key] = squeezed
elif squeezed.ndim == 2:
for num, data_level in enumerate(squeezed.T):
data_dict[key + '_' + str(num)] = data_level
else:
raise ValueError('cannot parse ndim > 2')
data = pd.DataFrame(data_dict, index=self.time)
Цель состоит в том, чтобы сжать данные NetCDF4 в отдельные серии Pandas, сохранить каждую серию в словарь, затем импортировать все это в фрейм данных и возвращение. Все, что я сделал, это добавил проверку, которая определяет, является ли сжатый ряд байтовым порядком байтов и преобразует его в байтовый порядок байтов. Мой исправленный код ниже:
for key, data in netcdf_data.variables.items():
# if accounts for possibility of extra variable returned
if key not in query_variables:
continue
squeezed = data[:].squeeze()
# If the data is big endian, swap the byte order to make it little endian
if squeezed.dtype.byteorder == '>':
squeezed = squeezed.byteswap().newbyteorder()
if squeezed.ndim == 1:
data_dict[key] = squeezed
elif squeezed.ndim == 2:
for num, data_level in enumerate(squeezed.T):
data_dict[key + '_' + str(num)] = data_level
else:
raise ValueError('cannot parse ndim > 2')
data = pd.DataFrame(data_dict, index=self.time)
Я использовал этот ответ переполнения стека , чтобы определить порядковый номер каждой серии. Документация SciPy дала мне некоторые подсказки относительно того, какими типами данных могут быть эти порядки байтов.
Вот мой запрос на получение pv-lib, который решает проблему для меня . Надеюсь, это поможет. Я до сих пор не знаю, почему проблема была противоречивой. Примерно в 95% случаев моя попытка get_processed_data
потерпит неудачу. Когда это сработало, я подумал, что нашел исправление, и тогда Pandas выдаст ошибку порядка байтов. После внесения исправления в pv-lib у меня больше нет ошибок из Pandas о больших или маленьких порядках байтов.