ungewöhnliches Datumsformat mit plot_date() zeichnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Markus V.
User
Beiträge: 2
Registriert: Dienstag 3. Juli 2012, 08:44

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
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.
Markus V.
User
Beiträge: 2
Registriert: Dienstag 3. Juli 2012, 08:44

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. :wink:

Wahrscheinlich geht's auch irgendwie einfacher, aber ich habe eine funktionierende Lösung: :mrgreen:

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
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()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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