112 votes

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

J'essaie de tracer des informations en fonction de dates. J'ai une liste de dates au format "01/02/1991".

Je les ai convertis en faisant ce qui suit :

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

ce qui donne 19910102

J'ai ensuite essayé d'utiliser num2date

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

L'intrigue :

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

Mais je reçois une erreur. Il est écrit "ValueError : year is out of range". Une solution ?

0 votes

Ah, j'ai donné un mauvais exemple de date. En fait, je n'ai pas le 31 décembre 2012 dans ma liste de dates. Je l'ai changé en 02 Jan 1991.

2 votes

Aide(num2date) : "x est une valeur flottante qui donne un plus le nombre de jours depuis 0001-01-01", donc x=19910102 ne correspond pas à 02 Jan 1991

0 votes

Qu'est-ce que l'analyseur syntaxique dans cette question ?

184voto

bernie Points 44206

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

Tout d'abord, convertissez vos chaînes de caractères 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 tracer :

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

12 votes

@bernie Merci, ça m'a vraiment aidé. Cependant, dans mon problème, j'ai trop de jours, donc toute la parcelle est bouchée. Comment afficher toutes les cinq dates ou toutes les dix dates sur l'axe des x avec votre méthode ?

2 votes

@erik Je sais que c'est un peu tard, mais j'ai supprimé les deux lignes set_major et cela a résolu le problème pour moi. J'ai perdu quelques fonctionnalités, mais c'est quand même une amélioration.

1 votes

Malheureusement, il ne me montre pas 3 dates, mais 6 autres dates (dans cet intervalle cependant). Utilisation de matplotlib-1.5.1

75voto

Jacek Szałęga Points 563

J'ai une réputation trop faible pour ajouter un commentaire à la réponse de @bernie, avec une réponse à @user1506145. Je me suis heurté au même problème.

1

La réponse à cette question est un paramètre d'intervalle qui corrige les choses.

2

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

3 votes

Veuillez noter que si vous prenez la première date d'une série ou d'un indice et la dernière date, étant donné qu'il s'agit d'une plage, la dernière date sera coupée, et vous rencontrerez des erreurs avec votre code. En supposant que vous ayez un Date sur votre index, alors vous pouvez le faire : days = mdates.drange(d1.index.min(),d1.index.max() + dt.timedelta(days=1),dt.timedelta(days=1)) . En fait, j'ai ajouté un jour à la date de la valeur supérieure de l'intervalle.

25voto

mathematical.coffee Points 23150

Comme l'a dit @KyssTao, help(dates.num2date) dit que le x doit être un flottant donnant le nombre de jours depuis le 0001-01-01 plus un. D'où, 19910102 n'est pas le 2 janvier 1991, car si vous comptiez 19910101 jours à partir de 0001-01-01, vous obtiendriez quelque chose en l'an 54513 ou similaire (divisez 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'

7 votes

Ce serait bien si vous pouviez ajouter le import pour aider les novices de Python comme moi.

0 votes

@kkuilla Si c'est toujours d'actualité, je suppose qu'il l'a en tant que import matplotlib.dates as dates

1voto

DomTomCat Points 3719

Adaptation de la réponse de @Jacek Szaga pour l'utilisation d'un chiffre fig et l'objet d'axes correspondant ax :

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

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot(days,y)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))
ax.tick_params(axis='x', labelrotation=45)

plt.show()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X