Python Auswertung aus einer Postgresql Tabelle (nested loop??)

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Donnerstag 6. Dezember 2018, 14:44

Hallo liebes Forum,

Ich habe eine Postgresql Tabelle die ich in Python auswerte und via matplottlib visualisiere.
Folgende Angaben: 72 rows â 300 values wobei der erste row einen unixtimestamp enthält den ich ein leserliches Format formatiere, die restlichen Werte sind decimals mit 2 Kommastellen.

Code: Alles auswählen

cursor = conn.cursor()
cursor.execute ("Select timestamp, sensor1, sensor2, sensor3 .... sensor71 from tabelle")
werte = cursor.fetchall()
timestamp = [];
dehnung =[];
dehnungNorm[];
for row in result:
    timestamp.append(datetime.utcfromtimestamp(row[0]).strftime('%Y-%m-%d %H:%M:%S'))
    dehnung.append(float(row[1]))
    dehnungNorm.append(float(row[1]))
Nachdem ich das gemacht habe Rechne ich ein bisschen hier und da und plotte dies anschließend. Das klappt alles so wie es sein muss und ist auch richtig, allerdings nur wenn ich genau ein row timestamp und 1 row Werte habe. Also 300 x Werte und 300 y Werte.
Das funktioniert auch wenn ich den timestamp und sensor x nehme.

Zu meiner Frage:
Wie könnte ich jetzt ein loop erstellen (nested loop?) damit mein Programm alle 71 sensoren nacheinander bearbeitet? Also es soll immer den timestamp + sensor1 danach timestamp mit sensor2 ... danach timestamp mit sensor50 usw...

Lg
(und sorry falls ich es umständlich beschrieben habe)
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 6. Dezember 2018, 15:43

Das Tabellendesign ist schlecht. Wenn Du die Möglichkeit hast, dieses zu ändern, dann tue es, SOFORT.
Tabellenspalten sollten sein: Timestamp, sensor_nummer, wert. Timestamp sollte in der Datenbank auch von diesem Format sein und nicht eine einfache Zahl.
`;` benutzt man in Python nicht zum Abschließen von Befehlen, die gehören alle weg.
`werte` wird nicht benutzt, und `result` wird nicht definiert. Bei `dehnungNorm` ist ein Syntax-Fehler.
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Donnerstag 6. Dezember 2018, 16:04

Danke für deine Antwort @Sirius3,

Code: Alles auswählen

Timestamp   |Sensor1|Sensor2|....|
___________________________________________________
1535753216 |241.09  |250.37  |.....|
1535753217 |237.55  |222.33  |.....|
So sieht die Tabelle aus und ich kann es nicht ändern.

Was ich aufgezeigt habe sollte nur erklären wie ich die Daten hole und bearbeite. Wie gesagt das funktioniert alles! wenn ich Fehler beim Beispiel gemacht hab tuts mir leid.

Meine Frage war: Wie kann ich das in Python umsetzen, dass es nachdem es den timestamp und den sensor1 bearbeitet hat, weiter macht mit sensor2 etc.?
Also es nimmt: 153575321 und 241.09 danach 153575321 udn 250.37 usw.
__deets__
User
Beiträge: 4016
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 6. Dezember 2018, 16:10

Code: Alles auswählen

timestamp = row[0]
for value in row[1:]:
    ....
ist ein snippet um über die gesamten Sensorwerte zu laufen, unter Beibehaltung des timestamps.

Und wer immer für den Tabellenentwurf verantwortlich ist - das ist wirklich nicht gut so. Die Tabelle ändern zu müssen, nur weil ein neuer Sensor hinzugefügt wurde, ist ganz schlecht.
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Freitag 7. Dezember 2018, 07:50

danke @__deets__ werde ich gleich mal ausprobieren :)
ich mache das beste daraus :D, angenehmen freitag!

LG
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Freitag 7. Dezember 2018, 07:57

danke @__deets__ klappt hervorragend, genau das was ich gesucht habe !
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Montag 10. Dezember 2018, 10:16

Ich hab noch ne Frage zu meiner Tabelle :D
Wie kann man den Unixtimestamp in Postgresql "updaten" also dass man Beispielsweise 1535753216 schon direkt in Postgresql als human readable timestamp(%Y-%m-%d %H:%M:%S) ansehen kann? (damit man das nicht noch zusätzlich in Python umwandeln muss.

@Sirius3 und @__deets__ ihr hattet es vorher schon angemerkt :D
__deets__
User
Beiträge: 4016
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 10. Dezember 2018, 11:14

Willst du die bestehende Tabelle veraendern?
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Montag 10. Dezember 2018, 11:34

Genau @__deets__ also nur die Spalte mit dem Timestamp ändern.
__deets__
User
Beiträge: 4016
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 10. Dezember 2018, 11:47

Dann musst du dich belesen, wie man Spalten in Postgres hinzufuegt, das geht mit dem ALTER TABLE statement.

Wenn du dann eine neue Tabellenspalte hast (ts_temp) zb, dann musst du ein UPDATE machen, in dem du den neuen aus dem alten Zeitstempel berechnest. Alternativ schreibst du dir ein kleines Python-Skript, was das fuer dich tut, und updatest jede Zeile "von Hand'.

Und dann entfernst du den alten Timestamp, und benennst ts_temp so um, wie es denn am Ende wirklich heissen soll.
yokay
User
Beiträge: 26
Registriert: Mittwoch 15. August 2018, 13:50

Montag 10. Dezember 2018, 12:03

danke @__deets__ bin schon dabei :)

lg
Antworten