Seite 1 von 1

Liniendiagramm mit einer Zeitachse erstellen

Verfasst: Freitag 8. Juni 2018, 09:51
von Chefter
Hallo zusammen,

ich möchte ein Diagramm plotten welches die Temperatur über die Zeit aufzeigt. Ich bin noch relativ am Anfang meiner Programmier-Kenntnisse. Leider haben die Beispiele im Web nicht das gewünschte Ergebnis geliefert.
Meine Daten liegen in einer CSV-Datei. Die Temperaturwerte konnte ich bereits in einem passenden Format einlesen. Jedoch macht die Zeit das Problem. In meiner CSV-Datei liegen die Zeiten im Format HH:MM:SS beginnend bei 00:00:00. Leider bekomme ich die Zeit nicht in ein Format, sodass ich es plotten kann.
Ich habe eine andere Alternative gesehen:

Code: Alles auswählen

# create data 
y = [ 2,4,6,8,10,12,14,16,18,20 ]
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(len(y))]
Jedoch bekomme ich es nicht hin, dass es bei 00:00:00 startet.

Mein bisheriger Code sieht wie folgt aus:

Code: Alles auswählen

import matplotlib.pyplot as plt
import matplotlib
import csv
import datetime
import numpy as np







with open('Mappe1.csv', newline='') as csvfile:
    readCSV1 = (csv.reader(csvfile, delimiter=' ', quotechar='|'))

    temps1 = []

    for a in readCSV1:
        temps1.append(a)

temps2 = []
i = 0
while i < len(temps1):
  a = temps1[i][0]
  b = a.replace(",",".")
  c = float(b)
  temps2.append(c)
  i = i + 1


plt.plot(temps2)
plt.gcf().autofmt_xdate()
plt.show()

Für Eure Hilfe wäre ich sehr dankbar :)

Re: Liniendiagramm mit einer Zeitachse erstellen

Verfasst: Freitag 8. Juni 2018, 10:30
von Sirius3
Dann fang halt nicht bei `now` an, sondern bei `00:00:00`.

`temps` ist ein mehrdeutiger Name; benutze keine Abkürzungen, sondern schreib es einfach aus `temperatures`. Die Zwischenliste temps1 ist unnötig, so spart man sich auch die angehängte Zahl, die man wegen Lesbarkeit auch vermeiden sollte. Genauso, was soll die 1 bei readCSV1 bedeuten? Die while-Schleife sollte eine for-Schleife direkt über temps1 sein und a, b und c sind eigentlich unnötige Zwischenvariablen.

Code: Alles auswählen

with open('Mappe1.csv', newline='') as csvfile:
    rows = csv.reader(csvfile, delimiter=' ', quotechar='|')
    temperatures = []
    for row in rows:
        temperatues.append(float(row[0].replace(",", ".")))

plt.plot(temperatures)
plt.gcf().autofmt_xdate()
plt.show()
Statt csv, könnte man auch direkt numpy.loadtxt benutzen.

Re: Liniendiagramm mit einer Zeitachse erstellen

Verfasst: Freitag 8. Juni 2018, 11:04
von Chefter
Danke für deine Antwort. Ich weiß, dass der Code nicht schön ist. Aber ich hatte am Anfang das Problem, dass ich die Liste von csc.reader nicht in float umwandeln konnte und ich mich mit den Variablen langsam vorgearbeitet habe.

Ich habe auch bereits deinen Vorschlag versucht:

Code: Alles auswählen

x = ['00:00:00' + datetime.timedelta(seconds=i) for i in range(len(temps2))]
Jedoch funktioniert das leider nicht. Meine Liste temps2 hat über 2000 Einträge. Ist es möglich. dass nach den Sekunden die Minuten hoch gezählt werden?

Re: Liniendiagramm mit einer Zeitachse erstellen

Verfasst: Freitag 8. Juni 2018, 12:12
von Sirius3
Natürlich funktioniert das nicht, weil Du versuchst, einen String mit einem timedelta-Objekt zu kombinieren. Du brauchst ein datetime-Objekt. Und die Sekunden werden bei timedelta automatisch in Minuten umgerechnet.

Re: Liniendiagramm mit einer Zeitachse erstellen

Verfasst: Freitag 8. Juni 2018, 12:44
von Chefter
Es hat jetzt funktioniert. Ich habe es jetzt wie folgt gemacht:

Code: Alles auswählen

with open('Mappe1.csv', newline='') as csvfile:
    readCSV1 = (csv.reader(csvfile, delimiter=' ', quotechar='|'))

    temps1 = []

    for a in readCSV1:
        temps1.append(a)

temps2 = []
i = 0
while i < len(temps1):
  a = temps1[i][0]
  b = a.replace(",",".")
  c = float(b)
  temps2.append(c)
  i = i + 1

date_timeobject = datetime.datetime.strptime('00:00:00', '%H:%M:%S')
x = [date_timeobject + datetime.timedelta(seconds=i) for i in range(len(temps2))]

plt.plot(x, temps2)
plt.gcf().autofmt_xdate()
plt.show()
Bitte den Teil mit den Variablen a,b.c überlesen. Darum kümmere ich mich später.

Jetzt habe ich noch das Problem, dass vor der Zeit eine 1 erscheint. Woran liegt das noch?


Vielen Dank für deine Geduld! :)