Liniendiagramm mit einer Zeitachse erstellen

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
Chefter
User
Beiträge: 8
Registriert: Mittwoch 2. Mai 2018, 11:23

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

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.
Chefter
User
Beiträge: 8
Registriert: Mittwoch 2. Mai 2018, 11:23

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

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.
Chefter
User
Beiträge: 8
Registriert: Mittwoch 2. Mai 2018, 11:23

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! :)
Antworten