2012-03-09 15 views
36

Sto cercando di tracciare le informazioni in base alle date. Ho un elenco di date nel formato "01/02/1991".Tracciare le date sull'asse x con il matplotlib di Python

li ho convertito facendo quanto segue:

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

che dà 19910102

Poi ho provato ad usare num2date

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

Plotting:

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

Ma ottengo un errore. Dice "ValueError: year is out of range". Qualche soluzione?

+0

Ah, mi ha dato una data cattivo esempio . Non ho in realtà 31 dicembre 2012 nella mia lista di date. L'ho cambiato in 02 gennaio 1991. –

+1

aiuto (num2date): "x è un valore float che dà uno più il numero di giorni dal 0001-01-01", quindi x = 19910102 non corrisponde al 02 gen 1991 –

risposta

14

Come @KyssTao è stato detto, help(dates.num2date) dice che il x deve essere un float dando il numero di giorni dal 0001-01-01 più uno. Quindi, 19910102 non è 2/gen/1991, perché se hai contato 19910101 giorni dal 0001-01-01 avresti ottenuto qualcosa nell'anno 54513 o simile (dividi per 365.25, numero di giorni in un anno).

Usa datestr2num invece (vedi help(dates.datestr2num)):

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

Si può fare questo più semplicemente utilizzando plot() invece di plot_date().

In primo luogo, convertire le stringhe alle istanze di 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 

Poi trama:

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

Risultato:

enter image description here

+0

voi potrei scrivere y = range (len (x)) –

+0

So solo che xrange() può essere usato per evitare la creazione di una lista; ma qui creiamo comunque una lista –

+0

Ho appena fatto un esperimento di temporizzazione con len (x) per essere 10Mio. Mi aspettavo che range() e la vostra comprensione delle liste con xrange() richiedessero uguale tempo; ma con mia sorpresa gamma() era ancora più veloce! –

Problemi correlati