Solución:
Puede hacer esto de manera más simple usando plot()
en lugar de plot_date()
.
Primero, convierta sus cadenas en instancias de Python datetime.date
:
import datetime as dt
dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here
Luego traza:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
Resultado:
Tengo una reputación demasiado baja para agregar un comentario a la respuesta de @bernie, con una respuesta a @ user1506145. Me he encontrado con el mismo problema.
La respuesta es un parámetro de intervalo que arregla las cosas.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt
np.random.seed(1)
N = 100
y = np.random.rand(N)
now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))
plt.plot(days,y)
plt.gcf().autofmt_xdate()
plt.show()
Como ha estado diciendo @KyssTao, help(dates.num2date)
dice que el x
tiene que ser un flotador que indique el número de días desde 0001-01-01 más uno. Por eso, 19910102
no es 2 / Ene / 1991, porque si contaras 19910101 días desde 0001-01-01 obtendrías algo en el año 54513 o similar (dividir por 365,25, número de días en un año).
Usar datestr2num
en su lugar (ver help(dates.datestr2num)
):
new_x = dates.datestr2num(date) # where date is '01/02/1991'