¿Cómo puedo usar xaxis_date () con barh ()?

en el código a continuación, bdate y edate son objetos datetime.datetime ():

pylab.barh(ypos, edate - bdate, left=bdate, height=TRMWidth ) 

pero esto lanza un AttributeError hacia abajo en dates.py._to_ordinalf ():

Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/pyplot.py”, línea 1926, en barh ret = ax.barh (parte inferior, anchura, altura, izquierda , ** kwargs) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py”, línea 4774, en orientación de barra = ‘horizontal’, ** kwargs) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py”, línea 4624, en ancho de barra = self.convert_xunits (ancho) Archivo “/ Library / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / site-packages / matplotlib / artist.py “, línea 147, en convert_xunits return ax.xaxis.convert_units (x) File” / Library / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / site-packages / matplotlib / axis.py “, línea 1312, en convert_units ret = self.converter.convert (x, self.units, self) Archivo” / Library /Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py “, línea 1125, en conversión return date2num (valor) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py”, línea 260, en date2num else: return np.asarray ([_ to_ordinalf (val) para val in d]) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/dates.py”, línea 189, en _to_ordinalf base = float (dt.toordinal ( ))

AttributeError: el objeto ‘datetime.timedelta’ no tiene atributo ‘toordinal’

Pensé que sería genial si pudiera empujar las fechas de las fechas en xaxis y hacer que funcionen los detalles; no tanto. ¿Alguna sugerencia sobre cómo hacer que las fechas sean compatibles con xaxis?

Lo que está sucediendo es que matplotlib en realidad no usa objetos de fecha y hora para trazar.

Las fechas se convierten primero en un formato de punto flotante interno. La conversión no está configurada para manejar timedeltas (que posiblemente sea un descuido).

Básicamente, puede hacer exactamente lo que quería, solo necesita convertir explícitamente las fechas al formato interno de matplotlib, y luego llamar a ax.xaxis_date() .

Como un ejemplo rápido (la mayor parte de esto es generar datos para trazar …):

 import datetime as dt import matplotlib.pyplot as plt import matplotlib.dates as mdates def drange(start, end, interval=dt.timedelta(days=1)): output = [] while start <= end: output.append(start) start += interval return output # Generate a series of dates for plotting... edate = drange(dt.datetime(2012, 2, 1), dt.datetime(2012, 6, 15), dt.timedelta(days=5)) bdate = drange(dt.datetime(2012, 1, 1), dt.datetime(2012, 5, 15), dt.timedelta(days=5)) # Now convert them to matplotlib's internal format... edate, bdate = [mdates.date2num(item) for item in (edate, bdate)] ypos = range(len(edate)) fig, ax = plt.subplots() # Plot the data ax.barh(ypos, edate - bdate, left=bdate, height=0.8, align='center') ax.axis('tight') # We need to tell matplotlib that these are dates... ax.xaxis_date() plt.show() 

introduzca la descripción de la imagen aquí