2017-06-12 3 views
1

Ich habe eine Anzahl von Malen im Format hh: mm: ss geschrieben, wenn ich den folgenden Code verwende und was x drucken ich bekomme 1900, 1, 1, 10, 29, 34 für jeden Zeitstempel . Wie kann ich Jahr, Monat und Datum wegnehmen? Wie ich die Zeit im Format hh haben möchte: mm: ssVerwenden von Datetime in Python

EDIT: Aktualisiert mit dem ganzen Code, wie es jetzt mit Hilfe von Kommentaren aussieht.

import matplotlib.pyplot as plt 
import matplotlib.ticker 
import time 
import datetime 

x = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

x_labels = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in x] 
formatter = matplotlib.ticker. FixedFormatter(x_labels) 
plt.gca().xaxis.set_major_formatter(formatter) 
plt.gca().xaxis.set_minor_formatter(formatter) 

plt.plot(x_labels, sy1, 'ro') 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.show() 

Aber offensichtlich zeigt es die Zeit an, wenn man das Jahr, den Monat und das Datum auch in Betracht zieht.

Plotting (wrong) time against y values

Wenn ich Strftime statt strptime verwenden erhalte ich eine Typeerror: Descriptor 'strftime' erfordert eine 'datetime.date' Objekt, sondern erhielt eine 'str'

+0

Also, ist das Problem mit Parsing Datumsangaben oder mit der Handlung? Trennen Sie diese zwei Dinge und nehmen Sie sie unabhängig an. – deceze

+0

versuchen Sie 'plt.plot (x, y)'. x und y sind bereits Listen, und matplotlib benötigt in diesem Fall keine 2d-Liste. – vroomfondel

+0

Ihre Änderungen haben den Verweis auf ein Bild entfernt. Versuchen Sie, mit Matplotlib zu plotten? Wahrscheinlich möchten Sie https://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.autofmt_xdate. Wenn Sie bearbeiten könnten, welche Plot-Bibliothek Sie verwenden, erhalten Sie möglicherweise Leute, die bereit sind zu antworten. –

Antwort

0

Ok. Es gibt ein paar Möglichkeiten, um zu bekommen, was Sie wollen.

Wenn Sie bereit sind, für mit Mikrosekunden zu regeln, sollten Sie ganz in der Nähe sein, was Sie brauchen:

import matplotlib.pyplot as plt 
import datetime 

time_strings = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings] 
plt.plot(times, sy1, 'ro') 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.show() 

Das die Zeiten zeigen sollten Sie in einem Plan wollen, nur mit Mikrosekunden in der Formatierung. Die Mikrosekunden machen alles hässlich, aber meine einzigen Änderungen waren für die Klarheit - ich habe nicht import time oder import matplotlib.ticker, ich änderte Ihre x zu einem genaueren Variablennamen und erstellte die Datumsangaben wie Sie. Um die Mikrosekunden loszuwerden, werden die Dinge hässlicher. Sie können nicht einfach den FixedFormatter verwenden, da wir nur 2 Werte festlegen und der Standard-Plot mehr als 2 Ticks hat; Sie müssen einen Weg finden, um den FuncFormatter zum Laufen zu bringen. Dies funktioniert wie gewünscht, ist aber immer noch zu laut, also füge ich die plt.gcf().autofmt_xdate() hinzu.

import matplotlib.pyplot as plt 
import matplotlib.ticker 
import datetime 
import pylab 

time_strings = ['10:29:55', '10:34:44']   
sy1 = [679.162, 679.802] 

times = [datetime.datetime.strptime(elem, '%H:%M:%S') for elem in time_strings] 
plt.plot(times, sy1, 'ro') 
formatter = matplotlib.ticker.FuncFormatter(lambda tick_value, _: datetime.datetime.strftime(pylab.num2date(tick_value), '%H:%M:%S')) 
plt.gca().xaxis.set_major_formatter(formatter) 
plt.gca().xaxis.set_minor_formatter(formatter) 
plt.xlabel('Time') 
plt.ylabel('Position') 
plt.gcf().autofmt_xdate() 
plt.show() 

Die Zeile, die den FuncFormatter definiert, ist unordentlich. Ich definiere ein Lambda, das eine Funktion ist, die in einer einzelnen Zeile definiert ist. FuncFormatter erwartet 2 Argumente. Der erste ist der tick_value, und es interessiert uns nicht, was der zweite ist, also gab ich ihm den Standardvariablennamen _, um zu zeigen, dass es uns egal ist. Die Tick-Werte sind Datums- oder Zeitstempel. Die Art, wie wir vom Tick-Wert zu einer Datetime gelangen, erfolgt durch Aufruf von pylab.num2date.

Sie werden feststellen, dass diese zweite Lösung genau das ist, was Sie brauchen. Das Wichtigste, was Sie tun mussten, war zu verfolgen, was Ihre Variablentypen waren und welche Variablentypen wo benötigt wurden.

+0

Danke. Meinst du plt.gca()? Leider bekomme ich einen Plan, wo die Werte im x wie 1900-01-01 10:29:34 herauskommen, also muss ich diesen Jahres-/Monats-/Datumsstempel loswerden.Ich lieh mir übrigens deinen letzten Code aus, ich wollte meinen alten nicht komplett ändern :) – Ofinns

+0

Ich habe den ganzen Code aktualisiert, und wie ich in meinem ersten Post geschrieben habe (gerade jetzt) ​​bekomme ich einen TypeError wenn ich strftime benutze . Tut mir leid, ich bin ernsthaft ein Anfänger. – Ofinns

+0

Vielen Dank, dass Sie Ihren gesamten Code hinzugefügt haben. :-) In Zukunft mach das bitte von Anfang an. Ich werde meine Antwort umschreiben, um zu reflektieren, was Sie uns jetzt gesagt haben. –