ValueError: Буфер с прямым порядком байтов не поддерживается компилятором с прямым порядком байтов - PullRequest
1 голос
/ 11 февраля 2020

Я моделирую массив PV, используя PVlib, и иногда, когда я пытаюсь получить доступ к данным прогноза погоды, я получаю следующую ошибку:

ValueError: Big-endian buffer not supported on little-endian compiler

Я не уверен, почему это происходит иногда, а не каждый раз Я запускаю код. Ниже приведен код, который я выполняю, и последняя строка вызывает ошибку. Любая помощь в решении этой проблемы будет принята с благодарностью, спасибо !!

# built-in python modules
import datetime
import inspect
import os
import pytz

# scientific python add-ons
import numpy as np
import pandas as pd

# plotting
# first line makes the plots appear in the notebook
%matplotlib inline 
import matplotlib.pyplot as plt
import matplotlib as mpl

#import the pvlib library
from pvlib import solarposition,irradiance,atmosphere,pvsystem
from pvlib.forecast import GFS
from pvlib.modelchain import ModelChain

pd.set_option('display.max_rows', 500)

latitude, longitude, tz = 21.300268, -157.80723, 'Pacific/Honolulu' 

# specify time range.
# start = pd.Timestamp(datetime.date.today(), tz=tz)
pacific = pytz.timezone('Etc/GMT+10')
# print(pacific)
# datetime.datetime(year, month, day, hour, minute, second, microsecond, tzinfo)
start2 = pd.Timestamp(datetime.datetime(2020, 2, 10, 13, 0, 0, 0, pacific))
# print(start)
# print(start2)
# print(datetime.date.today())

end = start2 + pd.Timedelta(days=1.5)

# Define forecast model
fm = GFS()

# get data from location specified above
forecast_data = fm.get_processed_data(latitude, longitude, start2, end)
# print(forecast_data)

1 Ответ

0 голосов
/ 29 февраля 2020

Я думаю, что у меня есть решение сейчас. По какой-то причине данные этих запросов 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 о больших или маленьких порядках байтов.

...