@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.
Datensatz eines Sensors plotten
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
Zuletzt geändert von Wunderkind89 am Mittwoch 18. November 2020, 10:09, insgesamt 1-mal geändert.
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
@_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.
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.
- __blackjack__
- User
- Beiträge: 14053
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Um es nochmal ganz klar zu sagen, wenn man die Daten vom ersten Post als Beispiel nimmt
dann hast Du die Daten mit dem richtigen Zeitdatentype in dem Format, wie Du es zur Darstellung brauchst.
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'])
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
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.__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.
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
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
Danke, man lernt nie ausSirius3 hat geschrieben: Mittwoch 18. November 2020, 12:54 Um es nochmal ganz klar zu sagen, wenn man die Daten vom ersten Post als Beispiel nimmtdann hast Du die Daten mit dem richtigen Zeitdatentype in dem Format, wie Du es zur Darstellung brauchst.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'])

Dank dir weiß ich jetzt, wie ich, die für mich relevanten Spalten betrachten kann.
Dankeschön
Zuletzt geändert von Wunderkind89 am Mittwoch 18. November 2020, 13:19, insgesamt 1-mal geändert.
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
@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
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
- __blackjack__
- User
- Beiträge: 14053
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Wunderkind89: Das was Du willst ist keine Frage der Daten, sondern der Anzeige/Darstellung. Das löst man in Matplotlib mit einem entsprechenden Formatter.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
Ich hab jetzt das folgende Beispiel gefunden und in ** meine Fragen und Gedanken aufgeführt.__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.
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
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
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.
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.
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
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.
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.
-
- User
- Beiträge: 512
- Registriert: Mittwoch 13. November 2019, 08:38
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.
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
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()
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()
-
- User
- Beiträge: 66
- Registriert: Sonntag 15. November 2020, 01:28
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()
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()