trazar la hora del día contra la fecha en matplotlib

Quiero trazar, de una manera específica, las fechas en el eje xy la hora del día en el eje y, y luego tener gráficos de líneas o gráficos de intervalo (barra flotante).

Esta respuesta SO ayuda

Pero tengo algunas diferencias con respecto a esa ttwig y no puedo hacer que funcione. En realidad, estoy obteniendo el eje y para trazar tanto las FECHAS como la hora, por lo que son meses de marcas demostrables en el eje y, cuando solo necesito el valor de un día. Ese ejemplo afirma en los comentarios, “la fecha base para yaxis puede ser cualquier cosa, ya que la información está en el tiempo”, pero no entiendo cómo está “tirando” la información de la fecha base.

En cualquier caso, mis necesidades son:

  1. Me gustaría la opción de 24 horas (00:00 a 24:00) o de hora am / pm para el eje y, con las marcas del eje como 3:00 pm, 11:00 am, etc. Esto será hecho con un FuncFormatter, supongo.

  2. Para los intervalos (rangos de tiempo) no quiero usar las barras de error, las líneas son demasiado delgadas. Me gustaría usar un gráfico de barras / columnas (flotante).

Mis datos son cadenas de fecha y hora del formato ‘2010-12-20 05:00:00’

Gracias por cualquier ayuda.

Creo que estás un poco confundido en cuanto a cómo exactamente matplotlib maneja los horarios y las fechas detrás de escena.

Todas las fechas en matplotlib se representan como simples flotadores. 1 día corresponde a una diferencia de 1.0, y las fechas están en días desde 1900 (si recuerdo bien, de todos modos).

Por lo tanto, para trazar la hora de una fecha determinada, debe utilizar un % 1 .

Voy a usar puntos, pero puedes usar barras fácilmente. Considere usar el argumento de la palabra clave bottom si usa plt.bar , de modo que la parte inferior de las barras comience a la hora de inicio de sus intervalos (y recuerde que el segundo argumento es la altura de la barra, no su parte superior y- valor).

Por ejemplo:

 import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np import datetime as dt # Make a series of events 1 day apart x = mpl.dates.drange(dt.datetime(2009,10,1), dt.datetime(2010,1,15), dt.timedelta(days=1)) # Vary the datetimes so that they occur at random times # Remember, 1.0 is equivalent to 1 day in this case... x += np.random.random(x.size) # We can extract the time by using a modulo 1, and adding an arbitrary base date times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...) # I'm just plotting points here, but you could just as easily use a bar. fig = plt.figure() ax = fig.add_subplot(111) ax.plot_date(x, times, 'ro') ax.yaxis_date() fig.autofmt_xdate() plt.show() 

Hora vs. Fecha

Esperemos que eso ayude un poco!

Siga la respuesta de Joe Kingston, pero agregaría que necesita convertir las cadenas de fecha en objetos de fecha y hora, lo que se puede hacer fácilmente con el módulo de fecha y hora, y luego convertirlos a fechas de matplotlib representadas como flotantes (que luego se pueden formatear como se desee ).

 import datetime as dt import matplotlib as mpl some_time_str = '2010-12-20 05:00:00' some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S') some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337 

Si comienzas con una matriz llena de cadenas de tiempo, puedes hacer algo como:

 time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00'] time_num_list = map( lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')), time_str_list) #[734126.20833333337, 734126.22916666663]