¿Por qué recibo el error “OverflowError: Python int demasiado grande para convertir a C largo” desde pandas / matplotlib?

Tengo un dataframe de pandas con fechas y valores máximos y mínimos llamados solflux :

  date max min 0 2015-01-01 148 10.5 1 2015-02-01 142 9.5 2 2015-03-01 140 9.0 3 2015-04-01 135 7.5 4 2015-05-01 132 7.5 ... 

Quiero trazar estos valores como barras de error en matplotlib. Uso lo siguiente para encontrar los valores que quiero.

 dates = solflux['date'] deltas = (solflux['max'] - solflux['min'])/2 means = solflux['min'] + deltas 

y luego trazar con

 import matplotlib.pyplot as plt f = plt.figure() ax = f.add_subplot(111) ax.errorbar(dates, means, marker='+', yerr=deltas) 

Entonces me sale este error:

 C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individu al plots. warnings.warn("No labelled objects found. " Traceback (most recent call last): File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 197, in __draw_idle_agg FigureCanvasAgg.draw(self) File "C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py", line 464, in draw self.figure.draw(self.renderer) File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "C:\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1143, in draw renderer, self, dsu, self.suppressComposite) File "C:\Anaconda3\lib\site-packages\matplotlib\image.py", line 139, in _draw_list_compositing_images a.draw(renderer) File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "C:\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 2409, in draw mimage._draw_list_compositing_images(renderer, self, dsu) File "C:\Anaconda3\lib\site-packages\matplotlib\image.py", line 139, in _draw_list_compositing_images a.draw(renderer) File "C:\Anaconda3\lib\site-packages\matplotlib\artist.py", line 63, in draw_wrapper draw(artist, renderer, *args, **kwargs) File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1136, in draw ticks_to_draw = self._update_ticks(renderer) File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 969, in _update_ticks tick_tups = [t for t in self.iter_ticks()] File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 969, in  tick_tups = [t for t in self.iter_ticks()] File "C:\Anaconda3\lib\site-packages\matplotlib\axis.py", line 912, in iter_ticks majorLocs = self.major.locator() File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 983, in __call__ self.refresh() File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 1003, in refresh dmin, dmax = self.viewlim_to_dt() File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 760, in viewlim_to_dt return num2date(vmin, self.tz), num2date(vmax, self.tz) File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 401, in num2date return _from_ordinalf(x, tz) File "C:\Anaconda3\lib\site-packages\matplotlib\dates.py", line 254, in _from_ordinalf dt = datetime.datetime.fromordinal(ix).replace(tzinfo=UTC) OverflowError: Python int too large to convert to C long 

Lo extraño es que si ignoro la parte yerr y simplemente ejecuto

 ax.plot(dates, means, marker='+') 

Todo funciona como se espera. Sospecho que este es un error en matplotlib, pero me preguntaba si alguien tenía alguna sugerencia.

Estoy ejecutando Python 3.6.0, Matplotlib 2.0.0 y Pandas 0.19.2 que está actualizado hasta donde tengo conocimiento.

También recibí un error cuando intenté ejecutar su código de ejemplo, pero no fue el mismo que usted publicó. El error que veo es:

 ValueError: invalid literal for float(): 2015-01-01 

Sin embargo, el rastreo de errores que publicaste también parece estar relacionado con las conversiones de fecha, por lo que podemos estar tratando básicamente con el mismo problema: ¿las fechas se almacenan como objetos de fecha? Puedo ejecutar su código de ejemplo con éxito después de convertir explícitamente las dates en un objeto Datetime , usando to_datetime() :

  date max min 0 2015-01-01 148 10.5 1 2015-02-01 142 9.5 2 2015-03-01 140 9.0 3 2015-04-01 135 7.5 4 2015-05-01 132 7.5 solflux = pd.read_clipboard() dates = pd.to_datetime(solflux['date']) deltas = (solflux['max'] - solflux['min'])/2 means = solflux['min'] + deltas f = plt.figure() ax = f.add_subplot(111) ax.errorbar(dates, means, marker='+', yerr=deltas) 

trama de series de tiempo

Sin embargo, tenga en cuenta que puede lograr el mismo resultado utilizando la funcionalidad nativa de Pandas, y las tags de ticks terminan un poco más limpias de esta manera:

 solflux.date = pd.to_datetime(solflux.date) solflux['deltas'] = (solflux['max'] - solflux['min'])/2 solflux['means'] = solflux['min'] + solflux.deltas 

Marco de datos:

  date max min deltas means 0 2015-01-01 148 10.5 68.75 79.25 1 2015-02-01 142 9.5 66.25 75.75 2 2015-03-01 140 9.0 65.50 74.50 3 2015-04-01 135 7.5 63.75 71.25 4 2015-05-01 132 7.5 62.25 69.75 

Ahora use plot() (opcionalmente establezca la date como índice, también puede configurar x='date' dentro de plot() ):

 solflux.set_index('date').plot(y='means', yerr='deltas', legend=False) 

serie temporal con pandas