2012-03-09 110 views
36

Estoy tratando de trazar la información contra las fechas. Tengo una lista de fechas en el formato "01/02/1991".Trazar las fechas en el eje x con matplotlib de Python

les convierten de la siguiente manera:

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

lo que da 19910102

Luego trató de utilizar num2date

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

Trazado:

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

Pero me sale un error. Dice "ValueError: año está fuera de rango". Alguna solución?

+0

Ah, me dio una mala fecha de ejemplo . En realidad, no tengo el 31 de diciembre de 2012 en mi lista de fechas. Lo he cambiado a 02 ene 1991. –

+1

help (num2date): "x es un valor flotante que da uno más el número de días desde 0001-01-01", entonces x = 19910102 no corresponde a 02 ene 1991 –

Respuesta

14

Como @KyssTao ha estado diciendo, help(dates.num2date) dice que el x tiene que ser un flotante que indica el número de días desde 0001-01-01 más uno. Por lo tanto, 19910102 no es 2/enero/1991, porque si contara 19910101 días desde 0001-01-01, obtendría algo en el año 54513 o similar (divida por 365.25, número de días en un año).

Uso datestr2num lugar (ver help(dates.datestr2num)):

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

Usted puede hacer esto más simple uso de plot() en lugar de plot_date().

En primer lugar, convertir sus cadenas a 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 

Entonces parcela:

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:

enter image description here

+0

usted podría simplemente escribir y = rango (len (x)) –

+0

Solo sé que se puede usar xrange() para evitar la creación de una lista; pero aquí creamos una lista de todos modos –

+0

Acabo de hacer un experimento de sincronización con len (x) para ser 10Mio. Esperaba que range() y tu lista de comprensión con xrange() tomaran igual tiempo; pero para mi rango sorpresa (¡fue aún más rápido! –

Cuestiones relacionadas