web-dev-qa-db-fra.com

Tracer des dates sur l'axe des x avec matplotlib de Python

J'essaie de tracer des informations contre des dates. J'ai une liste de dates dans le format "01/02/1991".

Je les ai convertis en procédant comme suit:

x = parser.parse(date).strftime('%Y%m%d'))

qui donne 19910102

Puis j'ai essayé d'utiliser num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

Traçage:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

Mais je reçois une erreur. Il indique "ValueError: l'année est en dehors des limites". Des solutions?

54
irl_irl

Comme @KyssTao l'a dit, help(dates.num2date) indique que x doit être un nombre à virgule indiquant le nombre de jours depuis le 01.01.2001 plus un. Par conséquent, 19910102 N’est pas le 2/Jan/1991, car si vous comptiez 19910101 jours à partir du 01.01.2001, vous obtiendrez quelque chose dans l’année 54513 ou similaire (division par 365,25, nombre de jours dans une année). ).

Utilisez datestr2num À la place (voir help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
19

Vous pouvez le faire plus simplement en utilisant plot() au lieu de plot_date().

Commencez par convertir vos chaînes en instances 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

Puis intrigue:

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()

Résultat:

enter image description here

105
bernie