Wetterdaten aufzeichnen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo, ich würde gerne Wetterdaten aufzeichnen wollen, welche Stündlich die Tagestemperatur in einer Tabelle, und dann den Tagesdurchschnitt mit Höchst- und Tiefsttemperatur in einer Tabelle (wo vom ganzen Jahr rein geschrieben wird) eingetragen werden soll.

    Eignet sich da am besten ein SQLite oder mehrere CSV-Dateien? Oder doch was anderes?

    Das ganze soll mit Python erfolgen.

    Im Nachhinein soll des auch auf einen Diagramm zu sehen sein.

    Perspektivisch möchte ich später mal mit Java eine GUI erstellen, welche ich am Bildschirm mit paar Klicks zugreifen kann.

    Was könnt ihr mir so empfehlen?

  • Rein aus Neugier: warum das Rad neu erfinden?

    Dafür gibt es eine Reihe guter Software, sogar kostenlos. Wenn der Pi die Daten bereits erfasst (oder eine Wetterstation die zur Verfügung stellt), dann sieh Dir doch mal Meteotemplate an.

    Ist zwar kein Python sondern PHP und momentan noch nicht ohne weiteres PHP 8 tauglich, aber bietet eine Menge.

    An der PHP 8 Tauglichkeit wird gerade gearbeitet.

    Wenn Du aus Spass an Freude selber was auf die Beine stellen willst, dann ist daß was anderes.

    Gruss

  • Eignet sich da am besten ein SQLite oder mehrere CSV-Dateien? Oder doch was anderes?

    Ich würde, auch für die vorgesehene spätere Abfrage eine SQL-Datenbank empfehlen, SQLite wäre nicht schlecht. Die Sprache ist vollkommen egal, nimm die, welche die kannst oder lernen willst (und für die es passende DB-Zugriffsplugins oder Schnittstellen gibt)

    Rein aus Neugier: warum das Rad neu erfinden?

    Warum nicht?

    Zum lernen ist so etwas immer ganz praktisch.

    Dafür gibt es eine Reihe guter Software, sogar kostenlos.

    Bei den Pakten, ob kostenlos, Shareware oder Kaufware habe ich immer das Problem, dass die zu umfangreich für das ist, was ich machen will.

    Schon bei Wordpress und Co wird man ja von Möglichkeiten erschlagen, die dann aber immer wieder zum gleichen Aussehen kommen.

    Ich verwendet für das Auslesen meiner Wetterstation zum Beispiel Weewx, doch dann lese ich die Datenbank direkt aus, um die Werte, die mich interessieren, auf auf meine Website zu bringen, wie ich es will.

    Auch weil das System bei mir zu Haue lokal läuft und mein Server zu hause die Daten, die ich darstellen will, auf meine Webseite schiebt. Der Webserver hat keinen Zugriff auf irgend ein internes System und ich geben meinen Server zu Hause nicht für Zugriffe von außen frei.

    Meine Webseite muss nur eins können: PHP, keine Datenbank, nichts weiter.

    (Schon das anpassen von PHP 7.4 auf 8 ist eine Krankheit gewesen, da die Tools nicht das können, was sie versprechen)

    Also alles so einfach wie möglich, dann ist man auch flexibel und nicht auf Tools angewiesen, die dann vielleicht nicht mehr funktionieren, weil sie nicht mehr supportet werden.

    Und für solche Übungen ist das, was der TO vor hat, ein schönes Übungsfeld.

    Computer ..... grrrrrr

  • Also ich würde dann SQLite nehmen.

    Eine Tabelle für die Tagestemperaturen (stündlich)

    Beispiel:


    Datum | Uhrzeit | Temperaturen

    16.05.23 13:30 15,7 C

    14:30 16,2 C

    17.05.23 0:30 7,1C

    u.s.w.

    und für die Tages Tiefst-, Höchst- und Durchschnittstemperatur

    Dann für jeden Tag der jeweilige Eintrag.

    Könnte das so passen?

  • Wenn Du statistisch gut verwertbare Werte willst, sollte das Intervall kürzer als stündlich sein, etwa 5 Minuten.

    Mit 1h Intervall wird das sonst ziemlich grob.

    Was ist mit Niederschlägen? Erfasst Du die auch?

    Gruss

  • Ich mache fange erstmal mit Temperaturen an, wenn das alles soweit klappt hole ich mir eine Wetterstation mit allen drum und dran.

    Mal ne Frage, würdet ihr für das Datum, Uhrzeit und Temperatur einzelne spalten nehmen, oder eine Spalte für das Datum und eine für Uhrzeit + Temperatur?

  • Bei mir sind Datum/Uhrzeit eine Spalte, aber Temperatur sollte auf alle Fälle separat sein. Dann hast Du es einfacher min./max. und Mittelwert zu ermitteln.

    Theoretisch geht das natürlich auch in einer Spalte, aber dann hast Du hinterher mehr Aufwand, die Werte wieder auseinander zu wursteln. ^^

    Wobei ich mir das nicht selbst ausgesucht habe, sondern die Daten von der Wetterstation bzw. der o.a. Software so in die DB geschrieben werden.

    Mit war es zu aufwändig, das selbst zu schreiben, zumal ich es so auch nicht hingekriegt hätte.

    Gruss

  • Wie soll denn eine Spalte für Uhrzeit und Temperatur funktionieren? Das sind doch zwei Werte. Man würde eine Spalte für Datum + Uhrzeit verwenden, statt das künstlich auf zwei Spalten aufzutrennen, denn das ist je *ein* Zeitpunkt der da beschrieben wird, und es gibt auch SQL-Datentypen dafür. Entweder TIMESTAMP oder DATETIME.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Datum und Uhrzeit würde ich zusammenfassen und ausschließlich UTC verwenden.

    Das hat dann den Vorteil, dass die Zeit nicht rückwärts springt, wie bei der Lokalzeit zur Winter-/Sommerzeitumstellung.

    Wenn es Python + sqlite3 sein soll, würde ich sqlite3 die Datentypen parsen lassen.

  • Wie soll denn eine Spalte für Uhrzeit und Temperatur funktionieren?...

    Falls dies keine rhetorische Frage war sondern sich auf meinen Post darüber bezog...

    Ich sagte extra **theoretisch**, wenn man alle Werte zusammenfasst und als eine Zeichenkette wegschreibt.

    Daß dies ein ziemlicher Blödsinn ist und man sich sowohl beim Schreiben als auch später bei der Ausgabe unnötigen Mehraufwand generiert, ist auch klar.

    Aber es soll Leute geben, die sich erst die Schuhe, dann die Hose anziehen. ^^

    Und ich würde es auch nie so machen (beides, die Werte zusammenfassen und die Anziehreihenfolge). ;)

    Gruss

  • Ich glaube nicht, dass matze1 das so meinte.

    Code
    datetime.datetime.now().time().isoformat() + str(13.37)
    Zitat

    '17:07:59.04880813.37'

    Vor allem, wie will man so etwas wieder sinnvoll trennen, wenn man diesen Gedanken zulässt.

  • Ich weiß, was du meinst. Dir geht es sicherlich um die Deduplizierung. Bei Datenbanken nennt man das Normalform soweit ich weiß.

    Mach dir darüber keinen Kopf. In der Praxis habe ich noch nie gesehen, dass sich jemand Gedanken über Zeitstempel macht.

    Dann kommt es noch darauf an, wie die Datenbank den Zeitstempel speichert.

    In anderen Datenbanken gibt es extra einen Typ für DateTime, die platzsparend gespeichert werden. Darum kümmert sich die Datenbank.

    Alternativ kannst du einen Zeitstempel abspeichern, der dann nur 64 Bit benötigt.

  • Das Problem ist aber, wenn ich aller 5 Minunten die Temperatur einschreibe - mit Uhrzeit - dann habe ich ja 288x das Datum mit stehen.

    Na und? Ich zeichne die Wetterdaten seit ca. 6 Jahren auf, in die DB wird alle 5 Minuten geschrieben.

    Ein sqldump der gesamten DB umfasst ca. 10MB, wo ist also das Problem? ;)

    Ausserdem ist es wiederum für einen Select Befehl hilfreich, wenn man alle Daten eines Tages auslesen will.

    Gruss

  • Man kann sich auch einfach Daten generieren und diese in eine DB schreiben, um dann die reale Größe in Erfahrung zu bringen.

    Zitat

    Generating data

    Writing data

    210240 rows

    Size: 7.09 MiB

    Code zum Generieren der Daten:

  • Warum muss kein `.commit()` und muss unbedingt de Typ mit detect_types=sqlite3.PARSE_DECLTYPES geparst werden?

    Da ich den Context-Manager des connection Objektes nutze, werden commits automatisch vor dem Verlassen des with-Blocks gemacht.

    Ein Rollback geschieht automatisch, wenn in dem with-Block eine Exception ausgelöst wird.

    Dokumentation: https://docs.python.org/3/library/sqli…context-manager

    Die Typen müssen nicht unbedingt mit PARSE_DECLTYPES geparst werden.

    Anstatt der datetime-Objekte bekommt man dann strings im ISO8601-Format und muss dann selbst die Objekte in datetime umwandeln, wenn man damit z.B. rechnen will.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!