Saltar al contenido

Trazar fechas en el eje x con matplotlib de Python

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:

ingrese la descripción de la imagen aquí

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.

1

La respuesta es un parámetro de intervalo que arregla las cosas.

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

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'
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *