Seite 2 von 2
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 10:05
von Wunderkind89
@Sirius
Ich hab die erste Spalte gelöscht, weil da zum einen "nur" eine Nummerierung stand, die für eine graphische Darstellung nicht wichtig war (so denke ich zumindest) und zum anderen, weil ich (noch) nicht weiß, wie ich auf die nächste Spalte zugreifen kann. Bei mir wurde das Datum in der falschen Spalte abgelesen: FEHLER: ValueError: time data '1' does not match format '%Y/%m/%d %H:%M:%S.%f'
Aber ich kann dein Argument sehr gut nachvollziehen, dass ich mir dadurch unnötig viel Arbeit gemacht habe und zum anderen, dass man dadurch wichtige Informationen verlieren kann, wenn man nicht aufpasst, besonders beim abspeichern der Excel Tabelle.
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 10:09
von Wunderkind89
@_blackjack_
Vielen lieben Dank für den deutlich besseren und sauberen Code und die Mühe so ausführlich zu antworten. Wenn ich dein Code laufen lasse, kommt die Fehlermeldung:
TypeError: strptime() argument 1 must be str, not Timestamp
Wenn ich aber diese Stelle auskommentiere, führt der Code wie gewohnt das aus, was ich auch hatte. Ich bin ein kompletter Neuling auf dem gebiet, aber ich verstehe zumindest die Fehlermeldung, dass das erste Argument von der Funktion strptime ein String sein muss. Das bedeutet, dass in der Zeile:
lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S.%f")
dieses x ein str sein muss. Da einfach str(x) zu schreiben wäre vermutlich nicht ganz so sinnvoll, denn dann wären wir bei dem selben Error:
ValueError: time data '2020-10-31 09:57:35' does not match format '%Y-%m-%d %H:%M:%S.%f
Ich bin ganz deiner Meinung: Redundanz im Code ist für mich persönlich auch nicht schön und steht für einen schlechten programmier-Stil.
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 12:27
von __blackjack__
@Wunderkind89: Also das was ich vermutete: Du hast das bereits `Timestamp`-Objekte und wandelst die in Zeichenketten um. Das ist Unsinn. Da muss überhaupt nichts umgewandelt werden.
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 12:54
von Sirius3
Um es nochmal ganz klar zu sagen, wenn man die Daten vom ersten Post als Beispiel nimmt
Code: Alles auswählen
import pandas as pd
import io
datafile = io.BytesIO(b'''";"zeit";"gate.1.in";"gate.1.out";"gate.2.in";"gate.2.out";"gate.3.in";"gate.3.out";"gate.4.in";"gate.4.out";"Total.Count"
"1";2020-10-31 09:57:35;0;0;0;0;0;0;0;0;0
"2";2020-10-31 09:57:36;0;0;0;0;0;0;0;0;0''')
data = pd.read_csv(datafile, sep=";", parse_dates=['zeit'])
dann hast Du die Daten mit dem richtigen Zeitdatentype in dem Format, wie Du es zur Darstellung brauchst.
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 13:02
von Wunderkind89
__blackjack__ hat geschrieben: Mittwoch 18. November 2020, 12:27
@Wunderkind89: Also das was ich vermutete: Du hast das bereits `Timestamp`-Objekte und wandelst die in Zeichenketten um. Das ist Unsinn. Da muss überhaupt nichts umgewandelt werden.
Mein Problem ist, dass ich zwar eine Tabelle mit Datum auf der x-Achse kriege, jedoch steht da Uhrzeit und Datum. Das sieht unschön aus und teilweise überlappt das Datum die Uhrzeit. Ich will an der Stelle nur die Uhrzeit gut lesbar plotten, ohne das Datum.
Ich muss das Ganze so hinkriegen, dass mein Programm auf die selbe Spalte zugreift, Datum von Uhrzeit trennt und nur die Uhrzeit für die Ausgabe aufnimmt.
Grüße
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 13:05
von Wunderkind89
Sirius3 hat geschrieben: Mittwoch 18. November 2020, 12:54
Um es nochmal ganz klar zu sagen, wenn man die Daten vom ersten Post als Beispiel nimmt
Code: Alles auswählen
import pandas as pd
import io
datafile = io.BytesIO(b'''";"zeit";"gate.1.in";"gate.1.out";"gate.2.in";"gate.2.out";"gate.3.in";"gate.3.out";"gate.4.in";"gate.4.out";"Total.Count"
"1";2020-10-31 09:57:35;0;0;0;0;0;0;0;0;0
"2";2020-10-31 09:57:36;0;0;0;0;0;0;0;0;0''')
data = pd.read_csv(datafile, sep=";", parse_dates=['zeit'])
dann hast Du die Daten mit dem richtigen Zeitdatentype in dem Format, wie Du es zur Darstellung brauchst.
Danke, man lernt nie aus

Je besser man sich in der Programmierung auskennt, desto mehr spart man sich unnötige Schritte, die zum Teil zu einem Fehler führen
Dank dir weiß ich jetzt, wie ich, die für mich relevanten Spalten betrachten kann.
Dankeschön
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 13:17
von Wunderkind89
@blackjack
Hier ein Pseudocode (der nur meinen Gedankengang zeigt aber NICHT richtig ist):
if (df['Date'] == '%H:%M:%S.%f'):
return df['Date']
Es kann sein, dass es extra dafür Funktionen gibt, die das für mich erledigen oder ich muss eben selber diese Funktion programmieren, nur ich wüsste jetzt nicht wie ich das von der Syntax her hinkriege.
Grüße
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 13:34
von __blackjack__
@Wunderkind89: Das was Du willst ist keine Frage der Daten, sondern der Anzeige/Darstellung. Das löst man in Matplotlib mit einem entsprechenden Formatter.
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 16:09
von Wunderkind89
__blackjack__ hat geschrieben: Mittwoch 18. November 2020, 13:34
@Wunderkind89: Das was Du willst ist keine Frage der Daten, sondern der Anzeige/Darstellung. Das löst man in Matplotlib mit einem entsprechenden Formatter.
Ich hab jetzt das folgende Beispiel gefunden und in ** meine Fragen und Gedanken aufgeführt.
Quelle:
https://stackoverflow.com/questions/353 ... t/35338570
import matplotlib
import matplotlib.pyplot as plt
from datetime import datetime
** das hier unten brauche ich nicht zu machen, weil ich hab bereits Daten, die ich nicht umwandeln muss
x_orig = ['2016-02-05 17:14:55', '2016-02-05 17:14:51', '2016-02-05 17:14:49']
x = [datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in x_orig]
y = ['35.764299', '20.3008', '36.94704']
** was geschieht in dem Abschnitt drunter? Ist das überhaupt ein sauberer Code, weil er greift mitten im Code auf die Bibliothek matplotlib. Mein Programm hat es anfangs nicht erkannt und dann wurde mir vorgeschlagen es zu importieren, also hab ich import gemacht und dann war matplotlib im Code nicht mehr rot unterschlängelt (keine Ahnung, ob das eine so gute Idee war). Was ist date2num(x)? Werden jetzt in hfmt Stunden, Minuten und Sekunden abgespeichert? **
xs = matplotlib.dates.date2num(x)
hfmt = matplotlib.dates.DateFormatter('%H:%M:%S')
** was geschieht in der zeile: ax.xaxis.set_major_formatter(hfmt). Ich verstehe das so, dass das ax bei uns "data" ist und durch den Punkt Operator kann man auf bestimmte Bereiche zugreifen **.
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.xaxis.set_major_formatter(hfmt)
plt.setp(ax.get_xticklabels(), rotation=15)
ax.plot(xs, y)
plt.show()
Ich sehe zwar, dass dieser Code mir die entsprechende Lösung liefert, aber
1) Ich frage mich, ob dieser Code sauber ist und ob es nicht deutlicher und einfacher ginge
2) Ich verstehe einige Zeilen (noch) nicht, wie die hier:
- xs = matplotlib.dates.date2num(x)
- hfmt = matplotlib.dates.DateFormatter('%H:%M:%S')
- ax.xaxis.set_major_formatter(hfmt)
Grüße
Re: Datensatz eines Sensors plotten
Verfasst: Mittwoch 18. November 2020, 17:17
von Wunderkind89
Meine Problem ist, dass ich manche Zeilen nicht verstehe was die Funktionen da genau machen, so dass ich dieses Beispiel auf mein Programm (noch) nicht übertragen kann bzw. es schwer umsetzen kann.
Deswegen muss ich im einzelnen verstehen, was dort genau gemacht wird, um überhaupt damit etwas sinnvolles anfangen zu können und es könnte zu weit führen.
Ich hab das Gefühl, dass ich nur eine Kleinigkeit ändern muss, damit ich es so hinkriege, wie ich es haben möchte.
Re: Datensatz eines Sensors plotten
Verfasst: Donnerstag 19. November 2020, 20:34
von Wunderkind89
Hallo zusammen, ich hab heute erneut am Code experimentiert und habe folgendes versucht:
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as pldates
DATA_FILENAME = "SmartCountr.xls"
def main():
data = pd.read_excel(DATA_FILENAME)
formatter = pldates.DateFormatter("%H:%M:%S")
ax.xaxis.set_major_formatter(formatter)
for label in (
f"Gate {number} {direction}"
for number in range(1, 5)
for direction in ["in", "out"]
):
ax.xaxis.set_major_formatter(formatter)
ax.plot(data["Date"], data[label], label=label)
axis_label_arguments = {
"family": "serif",
"weight": "normal",
"size": 16,
"labelpad": 6,
}
plt.xlabel("Time", color="r", **axis_label_arguments)
plt.ylabel("Frequency", color="b", **axis_label_arguments)
plt.suptitle("Sensor measurement errors", fontsize=16)
plt.legend()
plt.show()
if __name__ == "__main__":
main()
*********************************
Da wo bei mir plt.plot() stand, steht jetzt ax.plot(). Ist das überhaupt zielführend was ich da mache?
Auf der Seite (die ich entdeckt habe) wird folgendes gemacht:
1) fig = plt.figure()
2) ax = fig.add_subplot(1,1,1)
Ich verstehe immer noch nicht, was dieses ax ist! Ist das so etwas ähnliches, wie plt? Ich sehe nur, dass in dem Beispiel ax eine geplottete Grafik zugewiesen wurde oder verstehe ich das falsch? Ich komme da irgendwie kein Stück weiter. Es ist zu erwarten, dass in meinem Code eine Fehlermeldung kommt, weil ax nicht definiert wurde und genau da liegt das Problem, denn ich weiß nicht, was dieses ax enthält und inwieweit ich es in mein plot einbinden kann.
Wenn ich 1) und 2) anschaue, dann ist ax folgendes:
ax = plot(data["Date"], data[label], label=label).
Entweder liege ich komplett falsch oder nicht ganz richtig. Hat da jemand Tipps?
Da muss bestimmt nur eine Kleinigkeit geändert werden und schon läuft das, wie es laufen sollte.
PS: ich hatte vor mir Python anzueignen und das Buch "Python 3" von Heiko Kalista durch zu arbeiten. Leider komme ich nicht dazu wegen meinem Praktikum und befinde mich irgendwo mitten drin in der Thematik.
Re: Datensatz eines Sensors plotten
Verfasst: Donnerstag 19. November 2020, 21:55
von einfachTobi
Es hilft enorm sich die Dokumentation der verwendeten Bibliotheken anzusehen. Matplotlib ist da sehr ausführlich beschrieben und bietet auch einige Tutorials für den Einstieg:
https://matplotlib.org/tutorials/index.html.
Re: Datensatz eines Sensors plotten
Verfasst: Freitag 20. November 2020, 09:03
von Wunderkind89
Hallo zusammen, ich hab das Problem gelöst bekommen. Ein großes Dankeschön an dieser Stelle an euch alle!
Gern präsentiere ich meine Lösung:
from datetime import datetime
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as pldates
DATA_FILENAME = "SmartCountr.xls"
def main():
data = pd.read_excel(DATA_FILENAME)
x = [datetime.strptime(str(d), '%Y-%m-%d %H:%M:%S') for d in data ["Date"]]
xs = matplotlib.dates.date2num(x)
formatter = pldates.DateFormatter("%H:%M")
ax = plt.subplot()
ax.xaxis.set_major_formatter(formatter)
for label in (
f"Gate {number} {direction}"
for number in range(1, 5)
for direction in ["in", "out"]
):
ax.plot(xs, data[label], label=label)
axis_label_arguments = {
"family": "serif",
"weight": "normal",
"size": 16,
"labelpad": 6,
}
plt.xlabel("Time", color="r", **axis_label_arguments)
plt.ylabel("Frequency", color="b", **axis_label_arguments)
plt.suptitle("Sensor measurement errors", fontsize=16)
plt.legend()
plt.show()
if __name__ == "__main__":
main()
Re: Datensatz eines Sensors plotten
Verfasst: Freitag 20. November 2020, 09:03
von Wunderkind89
Hallo zusammen, ich hab das Problem gelöst bekommen. Ein großes Dankeschön an dieser Stelle an euch alle!
Gern präsentiere ich meine Lösung:
from datetime import datetime
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as pldates
DATA_FILENAME = "SmartCountr.xls"
def main():
data = pd.read_excel(DATA_FILENAME)
x = [datetime.strptime(str(d), '%Y-%m-%d %H:%M:%S') for d in data ["Date"]]
xs = matplotlib.dates.date2num(x)
formatter = pldates.DateFormatter("%H:%M")
ax = plt.subplot()
ax.xaxis.set_major_formatter(formatter)
for label in (
f"Gate {number} {direction}"
for number in range(1, 5)
for direction in ["in", "out"]
):
ax.plot(xs, data[label], label=label)
axis_label_arguments = {
"family": "serif",
"weight": "normal",
"size": 16,
"labelpad": 6,
}
plt.xlabel("Time", color="r", **axis_label_arguments)
plt.ylabel("Frequency", color="b", **axis_label_arguments)
plt.suptitle("Sensor measurement errors", fontsize=16)
plt.legend()
plt.show()
if __name__ == "__main__":
main()