Matplotlib: ¿Cómo usar marcas de tiempo con broken_barh?

Tengo un dataframe de pandas con marcas de tiempo como índice y valores numéricos en las columnas. Quiero usar broken_bar para dibujar rectangularjs para resaltar algunas partes de la serie temporal. ¿Cómo usar marcas de tiempo con broken_barh?

df.plot(ax = ax) ax.broken_barh([(startTs, pd.offsets.Week())], (10,50), facecolors = colors, alpha = 0.25) # Where type(startTs) is pandas.tslib.Timestamp 

Cuando ejecuto el fragmento de código anterior, obtengo ‘el argumento debe ser una cadena o un error de número’.

Gracias por adelantado.

Por lo que entiendo, los pandas trazan series de tiempo utilizando valores de período de acuerdo con la frecuencia de su índice. Esto tiene sentido porque matplotlib solo entiende el número como valores para el eje y, por lo tanto, su llamada a broken_barh falla porque está pasando un valor no numérico.

Para obtener el valor entero de un período de una marca de tiempo, debe usar .to_period() . Ver:

 In [110]: pd.to_datetime('2014-04-02').to_period('D').ordinal Out[110]: 16162 In [111]: pd.to_datetime('2014-04-02').to_period('W').ordinal Out[111]: 2310 

Luego, dependiendo del intervalo de tiempo (días, semanas, meses, etc.), debe averiguar cuál es el ancho que desea usar para la barra rota.

En el siguiente ejemplo, la frecuencia es de 1 día y el ancho de la barra para una semana es de 7 unidades.

 import numpy as np import matplotlib.pylab as plt import pandas as pd idx = pd.date_range('2013-04-01', '2013-05-18', freq='D') df = pd.DataFrame({'values': np.random.randn(len(idx))}, index=idx) ax = df.plot() start_period = idx[0].to_period('D').ordinal bar1 = [(start_period, 7), (start_period + 10, 5), (start_period + 25, 4)] bar2 = [(start_period, 1), (start_period + 22, 3), (start_period + 40, 2)] ax.broken_barh(bar1, [2, .2], facecolor='red') ax.broken_barh(bar2, [-2, .2], facecolor='green') plt.show() 

barra rota con marcas de tiempo