Uhrzeit plotten

  • Hi Leute,


    Ich generiere mit folgendem Code die aktuelle Uhrzeit:


    Code
    Zeit_Tupel=localtime()
    
    
    Zeit_Aktuell=trftime("%H:%M:%S", Zeit_Tupel)


    Zuvor natürlich

    Python
    from time import *


    Danach speichere ich die Uhrzeit zusammen mit Messwerten in einer CSV ab.
    Anschließend möchte ich sie mit matplotlib ploten.


    Bekomme aber folgende Fehlermeldung:


    Could not convert string to float : b'15:06:37'


    Könnt ihr mir sagen, woran das liegt? Bzw. was ich machen kann?

  • Hallo,


    Quote

    Could not convert string to float : b'15:06:37'
    Könnt ihr mir sagen, woran das liegt? Bzw. was ich machen kann?


    Du hast ein Bytes-Objekt, erwartet wird aber ein String - musst du halt konvertieren.


    Schöner ist aber, wie schon gesagt, ein datetime-Objekt mit dem datetime-Modul zu erzeugen.


    Gruß, noisefloor


  • Code
    import datetime
    
    
    Date = datetime.datetime(???)
    Uhrzeit_String = datetime.datetime.strftime(Date, "%H:%M:%S")
    Uhrzeit = datetime.datetime.strptime(Uhrzeit_String, "%H:%M:%S")
    print(Uhrzeit)


    Habe es mal so probiert. Aber ich brauche ja da aktuelle Datum. Wie bekomme ich das bei datetime? Im Time-Modul geht das ja easy mit localtime().

  • Hallo,


    Quote

    Aber ich brauche ja da aktuelle Datum


    Das Datum geht so:


    [code=php]>>> import datetime
    >>> datetime.date.today()
    datetime.date(2016, 9, 27)[/php]


    Allerdings brauchst du doch die Uhrzeit, oder?
    Das geht z.B. so:


    [code=php]>>> datetime.datetime.now().time()
    datetime.time(10, 15, 39, 327816)[/php]


    Ist aber auch alles in der Doku des `datetime`Moduls erklärt.


    Gruß, noisefloor


  • Das habe ich mittlerweile auch gefunden.


    Ich möchte aber später in meinem matplotlib Plot auf der X-Achse etwas wie 13:44:10 stehen haben.
    Das geht aber mit einem String von strftime() nicht. Und bei datetime.datetime.now().time() stehen die Millisekunden mit dran.
    Was komischerweise auch nicht geht ist, den String '13:44:10', welchen strftime() liefert in strptime() zu überführen.
    Da kommt trotz dem Format '%H:%M:%S' noch ein Datum vorne dran mit.

  • Hallo,


    wie generierst du denn die CSV-Datei? Bzw. zeigt mal was "nicht geht".


    Das geht nämlich eigentlich ohne Probleme:


    [code=php]>>> import datetime
    >>> now = datetime.datetime.now()
    >>> now
    datetime.datetime(2016, 9, 27, 13, 9, 50, 599566)
    >>> now.strftime('%H:%M:%S')
    '13:09:50'
    >>> [/php]


    Oder ist dein Problem das Lesen der CSV-Datei durch Matplotlib? Dazu hat dir bootsmann ja schon mal einen Link gegeben.


    Wenn du die CSV-Datei nur zum "zwischenspeichern" nimmst, dann solltest du vielleicht einen Unix Timestamp als Datum / Zeit schreiben. Dann hast du die volle Flexibilität bei minimalem Formatierungsaufwand.


    Gruß, noisefloor


    Gruß, noisefloor


  • Ich möchte aber später in meinem matplotlib Plot auf der X-Achse etwas wie 13:44:10 stehen haben.


    Tach'chen,
    ich zeichne schon seit längerer Zeit Raumlkima-Daten auf, die ich dann z.B. mit GNUplot plotte.
    Das Speichern der Daten in einer CSV geht soweit in Ordnung, wobei ich SQLite/ SQL für manche
    Projekte für besser geeignet halte. Den Datensatz kann man sich dann bei Bedarf mit einem SQL-Query
    in eine CSV holen (meist interessiert ja auch nur ein bestimmtes Intervall).


    Aus Erfahrung würde ich das Datum grundsätzlich als Unix-Timestamp speichern, d.h. als Integer-Wert
    der vergangenen Sekunden seit dem 01.01.1970. "Traditionell" unterstützen in der UNIX-Welt
    viele Programme dieses Zeitformat, ggf. muss man manchmal den Offset der EPOCH-Time
    verschieben, z.B. rechnet GNUplot ab dem 01.01.2000. Einen Zeitstempel ohne Nachkommastellen
    kann man mit:


    Code
    import time 
    timestamp = int (time.time())


    erzeugen. Zudem kann man damit viel einfacher rechnen, z.B. um Deinen Plot 24 Stunden
    vor der aktuellen Zeit beginnen zu lassen, muss man vom aktuellen Wert nur (60*60*24)
    86400 Sekunden subtrahieren.


    Zahlen lassen sich naturgemäß auch viel einfacher auf einer Achse plotten. Die "Kosmetik"
    d.h. das Formatieren der Achse, kann man schließlich von der matplotlib erledigen lassen:





    Hoffe das Dir das weiterhilft.
    Beste Grüße,
    /luetzel


  • Fehlermeldung:


    Traceback (most recent call last):
    File "/home/pi/Desktop/Python/CSV_TEST.py", line 31, in <module>
    x,y = np.loadtxt(Link, unpack=True, delimiter=',')
    File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 848, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
    File "/usr/lib/python3/dist-packages/numpy/lib/npyio.py", line 848, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
    ValueError: could not convert string to float: b'16:48:41.106464'

  • Hallo,


    die Fehlermeldung passt nicht zum Code... Du schreibst `Zeit` in die CSV-Datei, was ein komplettes Datetime-Objekt ist, also Datum plus Uhrzeit.


    Die Fehlermeldung sagt aber, dass da "nur" eine Uhrzeit (als Bytes-Objekt) drin ist - passt nicht zusammen.


    Hast du in der Datei noch andere / alten Daten drin? Du öffnest du Datei ja im Append-Mode.


    Gruß, noisefloor

  • Na wie schon geschrieben, macht wenig Sinn das Datum als formatierten String in einer CSV zu speicher
    Weiß zwar nicht, wie Du das formatieren willst und warum da Stunden auf der Y-Achse geplottet werden,
    aber wenn da ein Datum auf die x-achse zaubern willst, geht das mit ein wenig copy und paste aus dem
    Beispiel. Hab mir das jetzt nicht so genau angeschaut, aber das lässt sich alles noch optimieren.


  • An der gespeicherten CSV liegt es nicht, die habe ich gelöscht.


    Er gibt mir immer noch den Fehler "could not convert string to float"


    Und zwar beim Laden der CSV mit numpy....
    Bin echt überfordert grade -.-