2016-03-24 3 views
-1

Ich möchte Pandas DataFrame als Liniendiagramm mit X-Achse mit '% H:% M' Stil plotten.Zeitformat von Xaxis ändert sich nicht richtig auf Pandas Plot

Allerdings, wenn ich versuche, diese:

import datetime 
import pandas as pd 
import numpy as np 
d = pd.DataFrame([np.random.rand(3) for _ in range(9)]) 
d.index = [datetime.time(i, 0) for i in range(15,24)] 
ax = d.plot(xticks=d.index) 
plt.xticks([x.strftime("%H:%M") for x in d.index][0::4]) 

Diagramm mit% H:% M:% s Stil x-Achse ist ploted:

enter image description here

diesen answer Im Anschluss an, ich ve DateFormatter hinzugefügt:

import matplotlib.dates as md 
d = pd.DataFrame([np.random.rand(3) for _ in range(9)]) 
d.index = [datetime.time(i, 0) for i in range(15,24)] 
ax = d.plot(xticks=d.index) 
#plt.xticks([x.strftime("%H:%M") for x in d.index][0::4]) 
ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M')) 

Leider gehe ich t eine Handlung mit nur 00:00 X-Achse.

enter image description here

Ich mag% H erhalten:% M Stil x-Achse mit dem richtigen Intervall Ticks Label wie "15:00, 17:00, 19:00, 21:00" (alle 2 Intervalle hier). Wie erkenne ich das?

Antwort

0

Ich glaube, dass passiert, weil DateFormatting die Anweisungen für "%H:%M" nicht erkennt. Ersetzen Sie diese einfach durch die Integer-Anweisung %d und es sollte Ihnen das gewünschte Ergebnis geben (oder zumindest etwas, das Sie anpassen können). Im folgende Update des Codes Ich habe auch eine Drehung um Etiketten übermäßige Poltern in der x-Achse zu vermeiden:

import datetime 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as md 
d = pd.DataFrame([np.random.rand(3) for _ in range(9)]) 
d.index = [datetime.time(i, 0) for i in range(15,24)] 
ax = d.plot(xticks=d.index) 
plt.xticks(rotation=45) # Changed here 
ax.xaxis.set_major_formatter(md.DateFormatter('%d:%d')) # and here... 
plt.show() 

EDIT: Das obige Beispiel nur das Interpreter-String für das Formatierungsprogramm ändert. Ich habe mich nicht mit den Daten oder irgendetwas anderem beschäftigt. In jedem Fall sollten Sie idealerweise folgendes verwenden:

, um zu erreichen, was Sie wollen. Aber ich habe es gerade getestet und es scheint einen Fehler zu haben. Davon abgesehen lautet mein Ratschlag, dass Sie Ihre gewünschten Etiketten direkt in die Xticks einlesen.

import datetime 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
d = pd.DataFrame([np.random.rand(3) for _ in range(9)]) 
d.index = [datetime.time(i, 0).hour for i in range(15,24)] 
ax = d.plot(xticks=d.index) 
plt.xticks([datetime.time(i, 0).hour for i in range(15,24)][0::2],["%d:00"%datetime.time(i, 0).hour for i in range(15,24)][0::2],rotation=45) # Changed here 
plt.show() 

, die dazu führt:

x label with hours with a step of 2

+0

Danke, aber ich habe diese (http://i.imgur.com/jxcPC92.png) von Ihrem Code. – rkjt50r983

+0

Ich habe gerade das geändert, was ich als Ihr dringlichstes Problem empfand: die Tatsache, dass Ihre Etiketten unabhängig vom Standort auf Null gesetzt wurden (den Rest nahm ich an, dass Sie sich anpassen würden). Down-Voting eine Antwort, nur weil es keine Kopie Paste Lösung gibt scheint wie ein neuer Trend in SO. Persönlich finde ich es bedauerlich, aber ich denke, so ist es. Ich habe den Beitrag mit einer möglichen Lösung für Ihr Problem bearbeitet. – armatita