Seite 1 von 1
ungewöhnliches Datumsformat mit plot_date() zeichnen
Verfasst: Freitag 31. Mai 2013, 13:37
von Markus V.
Hallo zusammen,
ich habe das Problem, daß ich Daten aus einer csv-Datei zeichnen möchte, aber das Datumsformat leider nicht erkannt wird. Folgenden Code habe ich versucht:
Code: Alles auswählen
datei = mlab.csv2rec(csvname)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot_date(datei.time,datei.chan101,color='#000000',xdate=True,ydate=False)
Die Spalte 'time' beinhaltet Daten folgender Art:
05/29/2013 14:53:16:824
Folgende Fehlermeldung bekomme ich:
invalid literal for float(): 05/29/2013 14:53:16:824
Also würde ich dem plot_date()-Befehl gerne sagen, daß die Daten in Spalte 'time' das Format '%m/%d/%Y %H:%M:%S:%??' haben. Auf der matplotlib-Heimatseite habe ich schon viele Stunden gesucht, aber ich lande immer auf den gleichen Seiten, die mich nicht weiterbringen. Mir fehlt einfach die zündende Idee, wie ich weiter vorgehe.
Weiß jemand von euch, wie ich das Problem lösen könnte?
Vielen Dank & viele Grüße,
Markus
Re: ungewöhnliches Datumsformat mit plot_date() zeichnen
Verfasst: Freitag 31. Mai 2013, 14:17
von BlackJack
@Markus V.: Schau mal *wo* Du das Problem hast. Ich vermute mal nicht beim plotten, sondern beim einlesen. Die Daten müssen zum Plotten nämlich in `float`-Zahlen umgewandelt werden. Bei `mlab.csv2rec()` müsstest Du als `converterd` ein Wörterbuch angeben, dass die Spaltennummer, oder den Spaltennamen mit den Datumsangaben, auf eine Funktion abbildet, die eine Zeichenkette in dem gezeigten Format in eine Gleitkommazahl mit Sekunden seit 1.1.1 UTC umwandelt. Dabei hilfreich könnte das `matplotlib.dates`-Modul sein.
Re: ungewöhnliches Datumsformat mit plot_date() zeichnen
Verfasst: Montag 3. Juni 2013, 14:05
von Markus V.
Vielen Dank für Deinen wertvollen Hinweis!!! Der hat mich auf die richtige Spur geführt, auch wenn ich's unterm Strich anders umgesetzt habe.
Wahrscheinlich geht's auch irgendwie einfacher, aber ich habe eine funktionierende Lösung:
Code: Alles auswählen
csvname = 'dat00001.csv'
titel = 'bla bla bla'
yname1 = 'Temperatur in Grad Celsius'
datum_formatiert = []
datei = mlab.csv2rec(csvname)
for i in range(len(datei.time)):
datum_formatiert.append(date.datetime.strptime(datei.time[i],'%m/%d/%Y %H:%M:%S:%f'))
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot_date(datum_formatiert,datei.chan101,color='#000000',xdate=True,ydate=False)
Sonnige Grüße,
Markus
Re: ungewöhnliches Datumsformat mit plot_date() zeichnen
Verfasst: Montag 3. Juni 2013, 14:35
von BlackJack
@Markus V.: ``for i in range(len(sequenze)):`` nur im mit `i` dann die Elemente von `sequenze` zu indizieren ist in Python ein „anti pattern”, weil man direkt über die Elemente iterieren kann, ohne den unnötigen Umweg über einen Index. In diesem Fall kann man auch statt einer ``for``-Schleife eine „list comprehension” zum erstellen der Liste verwenden.
Der Name `datei` passt nicht zu den Daten, denn es sind ja die Datensätze hinter diesem Namen und kein Dateiobjekt.
`datum_formatiert` stimmt ebenfalls nicht, das es sich nicht um „formatierte” Datumsangaben handelt, sondern um Objekte die allgemein für ein Datum und eine Zeit stehen. Die kann man als Zeichenketten in einer bestimmten Form darstellen, aber die Objekte selbst sind in erster Linie für die Logik und nicht zur Darstellung gedacht.
Ungetestet:
Code: Alles auswählen
from datetime import datetime as DateTime
from matplotlib import mlab, pyplot as plt
def main():
csv_filename = 'dat00001.csv'
records = mlab.csv2rec(csv_filename)
dates = [
DateTime.strptime(date_string, '%m/%d/%Y %H:%M:%S:%f')
for date_string in records.time
]
figure = plt.figure()
axis = figure.add_subplot(111)
axis.plot_date(
dates, records.chan101, color='#000000', xdate=True, ydate=False
)
if __name__ == '__main__':
main()
Re: ungewöhnliches Datumsformat mit plot_date() zeichnen
Verfasst: Montag 3. Juni 2013, 15:11
von Sirius3
Und jetzt noch der direkte Weg, auch ungetestet:
Code: Alles auswählen
from datetime import datetime as DateTime
from matplotlib import mlab, pyplot as plt
def main():
csv_filename = 'dat00001.csv'
records = mlab.csv2rec(csv_filename, converterd={
'time': lambda date_string: DateTime.strptime(date_string, '%m/%d/%Y %H:%M:%S:%f')
})
figure = plt.figure()
axis = figure.add_subplot(111)
axis.plot_date(
records.time, records.chan101, color='#000000', xdate=True, ydate=False
)
if __name__ == '__main__':
main()