Es posible llamar al plt.plot(dates,values)
con dates
siendo una lista de objetos datetime.datetime
. La trama incluirá xticks en un formato como '%Y-%m-%d'
y al acercarse, cambiará automáticamente a uno que muestre horas, minutos, segundos.
Sin embargo, parece que desea más control que esto. Tal vez no muestra las horas, minutos, segundos en la escala que desea.
En ese caso, usted puede configurar su propia fecha formateador:
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
Por desgracia, si pasa datetime.datetime
objetos a plt.plot
, los xticks elegidos automáticamente por matplotlib parece tener siempre segundos igual a cero. Por ejemplo, si ejecuta
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks(rotation=25)
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()
fechas luego te con un formato agradable, pero todos los segundos Xtick son cero.
¿Cuál es la solución?
Si convierte sus marcas de tiempo -> datetime.datetime objects -> matplotlib datenums usted mismo, y pasa los datenums a plt.plot
, entonces los segundos se conservan.
PS. Por "matplotlib datenum" me refiero al tipo de número devuelto por matplotlib.dates.date2num
.
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks(rotation=25)
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()
Matplotlib duda _doesn't_ eliminar la información de tiempo cuando se traza datetimes ... ¿Qué estás haciendo exactamente? ¿Solo quieres cambiar el etiquetado del eje? ¿Solo desea una marca/etiqueta por punto de datos trazado? –