Seite 1 von 1

Veränderung des Zeitstempels

Verfasst: Mittwoch 17. Juni 2020, 09:11
von Sigischlitzohr
Hallo Python Community,

Ich bin neu im Programmieren, und habe für eine Vorlesung eine Aufgabenstellung erhalten, die ich leider nicht ganz verstehe bzw. nicht weiß, wie ich diese umsetzen soll. Diese lautet wie folgt:

"Hierbei gilt es, jeweils für die einzelnen Messstationen, die minimale Veränderung des Pegels innerhalb von 3 Stunden zu ermitteln und in einer neuen csv Datei zu speichern."

Ich habe bereits die CSV eingelesen, und die neue mit den geforderten Spalten erstellt, doch nun meine Frage: Ich habe in der alten CSV Datei einen Zeitstempel mit 15 Minuten werten, (2020-06-02T09:00:00+0100 ) wie kann ich diesen in 3h Werte umwandeln, und diese dann in der neuen CSV Datei als "Anfangszeit" und "Endzeit" ausgeben lassen ? Ich weiß das die Frage vielleicht banal wirken mag, doch leider fehlt mir einfach noch etwas das Verständnis dafür. Unten sende ich mit was ich bereits habe. Vielen Dank im voraus !


import csv
#öffnen der Ausgangsdatei
with open("Aufgabenstellung.csv", "r") as file:
csv_reader = csv.DictReader(file, delimiter=";") #csv_reader um die Datei zu lesen


with open("Ergebnis04.csv","w") as new_file: #neue CSV Datei erstellen im Schreib Modus

fieldnames = ["Stationsname","Stationsnummer","Gewässer","Startzeit","Endzeit","minimale Veränderung"] #Kopfzeile bestimmen

csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames,delimiter= ";")

csv_writer.writeheader()

for line in csv_reader: #nicht benötigte Spalten löschen
del line["EPSG-Code"]
del line["Einheit"]
del line["Zeitstempel in ISO8601"]
del line["Rechtswert"]
del line["Parameter"]
del line["Hochwert"]
del line["Seehöhe"]
del line["Wert"]
csv_writer.writerow(line)

Re: Veränderung des Zeitstempels

Verfasst: Mittwoch 17. Juni 2020, 14:45
von __blackjack__
@Sigischlitzohr: Anmerkungen zum Quelltext:

Eingerückt wird in Python vier Leerzeichen pro Ebene.

Beim öffnen von Textdateien sollte man immer eine explizite Kodierung angeben.

Bei CSV-Dateien *muss* man beim öffnen ``newline=""`` angeben.

`line` ist kein guter Name für etwas das keine Zeile in dem Sinne ist wie man das im Englischen verwendet. Das ist keine Zeile in einer Textdatei sondern eine Zeile in einer Tabelle und da sagt man `row` und nicht `line`. So eine Tabellenzeile muss in der CSV-Datei auch nicht nur *einer* Textzeile entsprechen, denn das CSV-Format erlaubt auch Zeilenumbrüche *in* Zellen.

Das löschen der ungewollten Spalten ist unnötig weil man beim `DictWriter` angeben kann, dass zusätzliche Schlüssel beim Schreiben einfach ignoriert werden. Und dann wird die ``for``-Schleife überflüssig weil `DictWriter` eine `writerows()`-Methode haben.

Überarbeitete Fassung:

Code: Alles auswählen

#!/usr/bin/env python3
import csv


def main():
    with open(
        "Aufgabenstellung.csv", "r", encoding="utf-8", newline=""
    ) as old_file:
        csv_reader = csv.DictReader(old_file, delimiter=";")
        with open(
            "Ergebnis04.csv", "w", encoding="utf-8", newline=""
        ) as new_file:
            csv_writer = csv.DictWriter(
                new_file,
                delimite=";",
                fieldnames=[
                    "Stationsname",
                    "Stationsnummer",
                    "Gewässer",
                    "Startzeit",
                    "Endzeit",
                    "minimale Veränderung",
                ],
                extrasaction="ignore",
            )
            csv_writer.writeheader()
            csv_writer.writerows(csv_reader)


if __name__ == "__main__":
    main()
Mir scheint aber, dass dieses einfache umkopieren mit löschen von ein paar Spalten nicht wirklich die Aufgabe löst. Die ich auch nicht so ganz verstehe ehrlich gesagt. Aber doch zumindest so viel als das man da wohl eher nicht alles selber schreiben möchte sondern die Pandas-Bibliothek ins Boot holen möchte. Womit der bisherige Code hinfällig ist.