Zeichnen von Daten auf der x-Achse mit Pythons Matplotlib

74

Ich versuche, Informationen gegen Daten zu zeichnen. Ich habe eine Liste von Daten im Format "01/02/1991".

Ich habe sie wie folgt konvertiert:

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

was gibt 19910102

Dann habe ich versucht, num2date zu verwenden

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

Plotten:

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

Aber ich bekomme einen Fehler. Es heißt "ValueError: Jahr liegt außerhalb des Bereichs". Irgendwelche Lösungen?

irl_irl
quelle
Ah, ich habe ein schlechtes Beispiel gegeben. Ich habe den 31. Dezember 2012 nicht in meiner Liste der Daten. Ich habe es auf 02. Januar 1991 geändert.
irl_irl
2
help (num2date): "x ist ein Gleitkommawert, der eins plus die Anzahl der Tage seit 0001-01-01 angibt", also entspricht x = 19910102 nicht dem 02. Januar 1991
Kyss Tao
Was ist Parser in dieser Frage?
John Snow

Antworten:

22

Wie @KyssTao gesagt hat, help(dates.num2date)sagt , dass die xAnzahl der Tage seit 0001-01-01 plus eins geben ein Schwimmer sein muss. Daher 19910102ist nicht 2 / Jan / 1991, denn wenn Sie 19910101 Tage vom 0001-01-01 gezählt haben, würden Sie etwas im Jahr 54513 oder ähnliches erhalten (dividiert durch 365,25, Anzahl der Tage in einem Jahr).

Verwenden Sie datestr2numstattdessen (siehe help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
mathematisch.Kaffee
quelle
Es wäre schön, wenn Sie auch die importAussage hinzufügen könnten , um Python-Neulingen wie mir zu helfen.
Kkuilla
140

Sie können dies einfacher tun, indem Sie plot()statt verwenden plot_date().

Konvertieren Sie zunächst Ihre Zeichenfolgen in Instanzen von 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

Dann Handlung:

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

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

mechanisches Fleisch
quelle
10
@bernie Danke, es hat mir wirklich geholfen. Bei meinem Problem habe ich jedoch zu viele Tage, sodass die gesamte Handlung verstopft ist. Wie können Sie mit Ihrer Methode jedes fünfte Datum oder jedes zehnte Datum auf der x-Achse anzeigen?
user1506145
1
@erik Ich weiß, dass dies etwas spät ist, aber ich habe die beiden Zeilen set_major entfernt und das hat es für mich geklärt. Einige Funktionen verloren, aber immer noch eine Verbesserung.
TheBoro
1
Leider zeigt es mir nicht 3 Daten, sondern 6 andere Daten (in diesem Intervall allerdings). Verwenden von matplotlib-1.5.1
Groosha
37

Ich habe einen zu geringen Ruf, um der Antwort von @bernie einen Kommentar hinzuzufügen, mit der Antwort auf @ user1506145. Ich bin auf dasselbe Problem gestoßen.

1

Die Antwort darauf ist ein Intervallparameter, der die Probleme behebt

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()
Jacek Szałęga
quelle