Я использую CSV-файл, содержащий данные о времени, температуре и влажности, а затем загружаю его, используя pandas и pyplot matplotlib для создания графиков данных.
С некоторыми значениями даты и времени я получаю сообщение об ошибке «ValueError: year out of range» с допустимыми значениями, без очевидного шаблона.
Это для Raspberry Pi (полностью обновляется через apt-get) с Python 2.7.13, пандами 0.19.2 и matplotlib 2.0.0. Я просмотрел бесчисленные страницы с помощью поисковых запросов Google, но пока не получил ничего для работы.
Обратите внимание, что я использую формат день / месяц / год (я в Новой Зеландии).
Нет очевидной разницы между хорошими и плохими строками, т. Е. Все они имеют правильные значения даты и времени плюс одинаковые окончания строк (CR LF).
Код, который показывает проблему:
#!/usr/bin/env python2
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
filename = 'tempfile.csv'
df = pd.read_csv(filename, names=['DateTime','Air Temperature','Humidity','CPU Temperature'], header = 0)
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d/%m/%Y %H:%M', utc=None)
df.plot(kind='line',x='DateTime',y='Air Temperature')
ax = plt.gca()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.savefig('graph.png')
plt.close()
Обычно это приводит к созданию графиков, однако некоторые значения приводят к ошибкам.
Пример файла данных:
16/06/2019 02:15,13.7,90.6,30.0
16/06/2019 02:30,13.7,92.2,30.0
16/06/2019 02:45,13.6,92.2,30.0
16/06/2019 03:00,13.4,92.0,30.0
16/06/2019 03:15,13.5,91.9,28.9
16/06/2019 03:30,13.5,91.9,28.9
Строка, которая приводит к ошибке:
16/06/2019 03:15,13.5,91.9,28.9
«Исправить» - просто изменить компонент времени, уменьшив значение минуты на 1, поэтому изменение строки проблемы на следующий результат позволяет избежать ошибки.
16/06/2019 03:14,13.5,91.9,28.9
Еще одно «исправление» - иметь только первые три строки или последние три строки данных CSV.
Еще одно «исправление» - закомментирование следующей строки, которая также приводит к работе кода, хотя и с потерей форматирования по оси X.
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
Тот факт, что это работает, заставляет меня думать, что сообщение об ошибке неправильно указывает на проблему года.
Полное сообщение об ошибке:
Traceback (most recent call last):
File "./max.py", line 18, in <module> plt.savefig('graph.png')
File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 697, in savefig res = fig.savefig(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1572, in savefig self.canvas.print_figure(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/backend_bases.py", line 2244, in print_figure **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 545, in print_png FigureCanvasAgg.draw(self)
File "/usr/lib/python2.7/dist-packages/matplotlib/backends/backend_agg.py", line 464, in draw self.figure.draw(self.renderer)
File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/figure.py", line 1143, in draw renderer, self, dsu, self.suppressComposite)
File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images a.draw(renderer)
File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 2409, in draw mimage._draw_list_compositing_images(renderer, self, dsu)
File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 139, in _draw_list_compositing_images a.draw(renderer)
File "/usr/lib/python2.7/dist-packages/matplotlib/artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/axis.py", line 1136, in draw ticks_to_draw = self._update_ticks(renderer)
File "/usr/lib/python2.7/dist-packages/matplotlib/axis.py", line 969, in _update_ticks tick_tups = [t for t in self.iter_ticks()]
File "/usr/lib/python2.7/dist-packages/matplotlib/axis.py", line 916, in iter_ticks for i, val in enumerate(majorLocs)]
File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 466, in __call__ dt = num2date(x, self.tz)
File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 401, in num2date return _from_ordinalf(x, tz)
File "/usr/lib/python2.7/dist-packages/matplotlib/dates.py", line 254, in _from_ordinalf dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC)
ValueError: year is out of range
Обновлено, чтобы показывать только минимальный контрольный пример.
Статистическая функция рассчитывала среднее значение и стандартное отклонение, которое было удалено из приведенного выше кода, так как оно не влияло на результат.