Aktuelle und jährliche grafische Darstellungen der Stauinhalte der Harzer Talsperren


Nota bene: die folgende Seite enthält viele (> 50) statische, größere Grafiken, und sollte wenn möglich auf mindestens einem Tablet, besser noch einem grossen Monitor angezeigt werden. Smartphone bringt nix.





1. Harzer Talsperren und Trinkwasserversorgung

Die Trinkwasserversorgung im mittleren Niedersachsen wird hauptsächlich durch Grundwasser, aber auch durch einige Stauseen im Harz gesichert. So wurden zum Beispiel in 2013 für die öffentliche Wasserversorgung in Niedersachsen 557 Millionen m³ (ein halber Kubikkilometer etwa) Wasser gefördert, davon 86% Grundwasser und 11%, also 61 Mio m³ Wasser der Harzer Talsperren (Quelle: Niedersächsisches Ministerium für Umwelt, Energie, Bauen und Klimaschutz).

Von den sechs durch die Harzwasserwerke GmbH verwalteten Harzer Talsperren führen Leitungen nach Wolfenbüttel, Braunschweig und Wolfsburg, nach Göttingen, Bad Gandersheim, Hildesheim, Lehrte, Neustadt, sogar nach Bremen, aber auch in das Hannoversche Umland, z.B. werden Teile der Vororte Laatzen, Rethen und Seelze über den Versorger enercity komplett mit Wasser aus den Talsperren versorgt (Quelle: Trinkwasseranalyse der Harzerwasserwerke auf enercity AG). Weiterhin wird das Wasser aus dem Harz mancherorts (z.B. im Süden Hannovers, im Wasserwerk Grasdorf) auch gefördertem Grundwasser beigemischt, da es generell sehr weich ist und hilft, zu kalkhaltiges Grundwasser zu enthärten.

Da Grundwasser eine teils sehr hohe Verweilzeit aufweist, je nach Beschaffenheit des Untergrundes, der Tiefe des Entnahmepunkts und anderen Parametern zwischen mehreren Jahren und Jahrzehnten, kann die "Latenz" (Zeitabstand Zufluss - Abfluss bzw. Entnahme, im englischsprachigen Raum als "groundwater recharge rate" bezeichnet) dieser Trinkwasserquelle als relativ hoch angenommen werden.

Die Latenz von Talsperrenwasser dagegen scheint weit geringer (abhängig von den Eigenschaften des Einzugsgebietes), nach einem kräftigen Regen können die Pegelstände von Stauseen und Flüssen innerhalb von Tagen signifikant ansteigen, manchmal sogar von Stunden. Verglichen mit dem Grundwasser verhält sich also Talsperrenwasser zeitlich weit dynamischer, und beinhaltet zudem eine in Maßen steuerbare Komponente: die Abgabe von Stauwasser in den weiteren Flusslauf.

Seit Juli 2017, der hier auffällig regenreich war, interessierte mich, welche Auswirkungen Wetterphänomene auf die Talsperren, und damit auf die lokale Trinkwasserversorgung haben. Dazu begann ich, die täglichen Wasserstandsdaten der Harzer Talsperren zu beobachten (interaktive Karte des Nordharzes hier):

Eckertalsperre
Eintrag auf Wikipedia
Pegelstand des Niedersächsischen Landesbetriebs für Wasserwirtschaft,Küsten- und Naturschutz (NLWKN)
Flussfolge: EckerOkerAllerWeser
Granetalsperre
Eintrag auf Wikipedia
Pegelstand des NLWKN
Flussfolge: GraneInnersteLeineAllerWeser
Innerstetalsperre
Eintrag auf Wikipedia
Pegelstand des NLWKN
Flussfolge: InnersteLeineAllerWeser
Odertalsperre
Eintrag auf Wikipedia
Pegelstand des NLWKN
Flussfolge: OderRhumeLeineAllerWeser
Okertalsperre
Eintrag auf Wikipedia
Pegelstand des NLWKN
Flussfolge: OkerAllerWeser
Sösetalsperre
Eintrag auf Wikipedia
Pegelstand des NLWKN
Flussfolge: SöseRhumeLeineAllerWeser

Die Grane-, Oker- und Innerstetalsperre bilden zusammen das "Nordharzverbundsystem" (Link öffnet PDF der Harzwasserwerke zum Neubewilligungsverfahren des Verbundes 2017), welches unter allen sechs Talsperren die Hauptverantwortung für die Trinkwasserversorgung aus dem Harz trägt. Zu diesem Zweck existiert eine wasserführende Verbindung zwischen der Oker- und der Granetalsperre, der Oker-Grane-Stollen, eine Pumpleitungsverbindung Innerste- zur Granetalsperre (knapp 50m Höhenunterschied) und der Radau-Stollen vom Fluss Radau zur Okertalsperre (und folglich auch zu Granetalsperre).

Zwar veröffentlichen der NLWKN und die Harzwasserwerke GmbH statistische und wasserwirtschaftliche Untersuchungen wie z.B. dieses sehr interessante Papier "Wasserwirtschaft im Harz 1941 - 2018" des Jahres 2018, auf den öffentlich zugänglichen Seiten sind bis auf derartige Kompendien und die täglichen Talsperren-Wasserstandsdaten jedoch kaum zeitnahe oder historische Zahlen zu finden.

Diese täglichen Wasserstandsdaten der Harzwasserwerke enthalten die Staustände inklusive des Niederschlags, Zuflusses, sowie der Unterwasserabgabe in Form einer PDF-Datei (Gesamtübersicht dort genannt). Die PDFs lud ich mir seit Herbst 2018 mehr oder minder regelmäßig runter, um die Assoziation jährliches Wetter im Verhältnis zum Stand der Talsperren (und damit im Verhältnis zur teilweisen Sicherstellung unserer Trinkwasserversorgung) selbst genauer beobachten zu können.




2. Auswertungen der Daten der Harzer Talsperren

2021 im Sommer begann ich dann, diese PDF-Daten in einer Datenbank zu speichern, und grafisch auszuwerten. Die Daten enthalten für jeder der sechs Talsperren die Werte

  • Stand: Zeitpunkt der Erstellung der Daten, hoffentlich auch in etwa der der Messungen
  • Niederschlag: in Millimetern (Liter pro Quadratmeter) zwischen Vortag 07:30 und dem Zeitpunkt der Gesamtmessung, nur an der Talsperre gemessen
  • Stauhöhe: aktueller Wasserstand in Metern über Normalnull
  • Stauinhalt: aktueller Gesamtinhalt (oder entnehmbarer Inhalt?) in Millionen Kubikmetern
  • Füllungsgrad: Inhalt relativ zum Maximalinhalt in Prozent
  • Zufluss: insgesamt zufließendes Wasser in Kubikmetern pro Sekunde
  • UW-Abgabe: Unterwasserabgabe, also steuerbarer Abfluss in den folgenden Ablauf (Fluss) in Kubikmetern pro Sekunde

Ausgehend von diesen Daten schrieb ich mir ein Skript (kleines Programm), das einzelne Grafikdateien vom zeitlichen Verlauf und Vergleich dieser Größen liefert. Sinn der verschiedenen grafischen Darstellungen ist der Versuch, durch unterschiedliche Blickwinkel auf die Daten mögliche Zusammenhänge zwischen den Werten erkennbar zu machen (Data-Mining im Kleinen, da nur geringfügige Datenmenge), die auf individuelle Eigenschaften der jeweiligen Talsperren oder der Region hinweisen könnten.




3. Grafiken absoluter Stauinhalte

Die Stabilität der Trinkwasserversorgung hängt in erster Linie vom Gesamtstand der versorgenden Talsperren ab, daher zuerst die Visualisierung der aufsummierten absoluten Stauinhalte aller sechs Talsperren. Der maximal mögliche Inhalt beträgt 182 Millionen Kubikmeter. Die Entwicklungen in Jahresintervallen:




Man kann schön als zuflussreichste Zeit das erste Quartal zwischen Anfang Januar und Ende März identifizieren. In 2019 stieg in dieser Periode der Gesamtstand von etwas über 80 Mio m³ auf über 150 Mio m³, also fast eine Verdopplung des Stauvolumens. Ab Anfang/Mitte April fällt der Inhalt dann jahreszeitlich bedingt regelmäßig und stetig ab. Der durchschnittliche Stauinhalt aller Talsperren im Verbund betrug 113 in 2019, 104 in 2020, 107 in 2021 und bisher in 2022 etwa 138 Mio m³.

Ich sollte hier vielleicht noch schnell einschieben, dass meine Deutungen hauptsächlich auf Laienwissen beruhen, insbesondere auf Wikipedia-Einträge zu Stauseen und ähnlichen Quellen. Ich habe nie Wasserwirtschaft studiert, ich weiss nicht einmal, wie man das schreibt. Meine Interpretationen also bitte nicht überbewerten, die können auch ganz leicht ganz weit danebenliegen. Nichtsdestotrotz.



Auffällig ist die anfangs sehr trockene Herbst-Winterperiode 2018, in der der Gesamtpegel auf unter 50 Mio m³ fiel, um dann allerdings wie erwähnt innerhalb eines Quartals wieder auf über 150 Mio m³ zu steigen.

Das Jahr 2021 zeigte eine geringere Dynamik als die beiden vorausgegangenen Jahre: ein geringerer Gesamtpegel, aber dafür aufgrund des regenreicheren Sommers ein höheren Stauinhalt im Herbst. In Zahlen: der maximale Stauinhalt aller Talsperren 2021 lag mit knapp über 120 Mio m³ weit unter den 150 Mio m³ in den beiden vorausgehenden Jahren. Andererseits aber nahm dieser Inhalt bis in den Herbst auf nur 100 Mio m³ ab gegenüber zum Teil weniger als 80 Mio m³ in 2018, 2019 und 2020.

2022 startete mit einem relativ hohem Pegel, resultierend aus einem vergleichsweise geringem Rückgang im Sommer und Herbst 2021. Zur Veranschaulichung die Gesamtpegelstände an den Jahreswechseln:

  • 2021 auf 2022: 110.4 Mio m³
  • 2020 auf 2021: 75,4 Mio m³
  • 2019 auf 2020: 90,8 Mio m³
  • 2018 auf 2019: 78,1 Mio m³



Wie erwähnt bilden die Stauseen Grane, Innerste und Oker als Nordharzverbundsystem die Eckpfeiler der Trinkwasserversorgung der Harzer Talsperren. Diese drei verfügen über einen Gesamtstauinhalt von 112,5 Mio m³, ein Gesamteinzugsgebiet von 204 km² und, soweit ich das überblicke, eine wasserrechtliche Bewilligung für die Entnahme von knapp 85 Mio m³ Trinkwasser pro Jahr. Aus diesem Grund hier der aufsummierte Inhalt dieser drei Talsperren nochmal gesondert:



Der aufsummierte, im Vergleich zu den Vorjahren relativ hohe Pegel dieser drei Talsperren bisher in 2022 weisen meines Erachtens auf eine seit einiger Zeit stattfindenden, strategischen Anpassung der Harzwasserwerke an die durch den Klimawandel verursachten Änderungen der Niederschlags-Dynamik hin.

Die Wahrscheinlichkeit längerer Trocken- oder sogar Dürre-Perioden steigt etwas, und erfordert dementsprechend mehr Rückhaltevolumen. Zwar scheinen schon seit Jahren Planungen für neue Speicherkapazitäten im Gang zu sein, siehe zum Beispiel den Bericht der "Zeitung für kommunale Wirtschaft" vom März 2021 über Planungen zusätzlicher Stauvolumen von bis zu 90 Mio m³, deren Realisierung wird jedoch noch lange Zeit benötigen, während Reaktionen auf geänderte klimatische Bedingungen zeitnah und kurzfristig erforderlich sind, um den Anteil des Harzwassers für die Trinkwasserversorgung Niedersachsens zu garantieren, stabilisieren oder sogar zu erhöhen.




4. Grafiken relativer Stauinhalte

Eine weitere Sicht auf die Stauseen-Daten ist der direkte Vergleich der prozentualen Stauinhalte, des relativen Füllungsgrades aller Talsperren:



Die geringsten Varianzen des Stauinhalts sind bei der Grane- und Eckertalsperre aufzufinden, wobei die Granetalsperre etwa das 3,5-fache Stauvolumen der Eckertalsperre besitzt.



Die höchste Standardabweichung des Jahresinhalts weist die Odertalsperre auf. obwohl sie, wie in ihrer Einzelbetrachtung sichtbar wird, im Vergleich weder den höchsten Zufluss noch die höchste Niederschlagsmenge aller sechs Talsperren empfängt. Allerdings "führt" die Odertalsperre bei der Unterwasser-Abgabe. Laut Harzwasserwerken dient sie nicht als Trinkwasserreservoir, sondern nur zur Regelung der abfließenden Oder und Rhume.

Ende Februar 2022 stieg erstmals wieder seit März 2019 der Füllstand aller sechs Talsperren gleichzeitig über 80%. Der Pegel der Granetalsperre wird wie schon in 2020 auf einem hohen Niveau gehalten (Regelung über Abfluß in die Grane und Zufluß durch Oker- und Innerstetalsperre).



Wie in den einzelnen Jahresgraphen oben wird auch hier deutlich, dass der Füllungsgrad der Granetalsperre im Jahresmittel am höchsten ist, mit einem durchschnittlichen Füllungsgrad von ca. 73% mehr als zehn Prozentpunkte über dem der restlichen Talsperren. Die Daten zeigen gut, dass die Granetalsperre auch durch ihre Verbindungen mit den anderen Talsperren als "Rückgrat" der Trinkwasserversorgung konzipiert wurde: ein relativ grosses und auf hohem Stand stabilisierbares Volumen, das auch dann noch beansprucht werden kann, wenn die Wasserstände der anderen Stauseen durch eine längere Trockenperiode schon weit abgesunken sind, und diese wieder verstärkt andere Aufgaben wie die Niedrigwasseraufhöhung übernehmen müssen.




5. Grafiken Jahresdifferenzen der Stauinhalte

Um die Entwicklung der Stauinhalte jahres- oder monatsweise vergleichen zu können, zeige ich hier Plots der Jahresdifferenzen der Stauinhalte aller sechs Talsperren, beginnend mit dem Jahr 2019 im Vergleich zu 2018:



An der Jahresdifferenz 2020 zu 2019 wird sichtbar, wie in 2020 die Stauinhalte im Vergleich zum Vorjahr hauptsächlich weniger zunahmen oder sogar mehr abnahmen, insbesondere ab etwa Mitte März 2020. Daraus resultierte wie oben angeführt dann ein durchschnittlicher Gesamtinhalt von 104 Mio m³ in 2020, mehr als. 9 Mio m³ weniger als in 2019.



Das Jahr 2021 brachte im Vergleich zu 2020 dann offenbar etwas Entspannung: zwar stiegen die Stauinhalte im ersten und teilweise auch zweiten Quartal 2021 nicht so hoch wie noch in 2020, dann aber wurden die Differenzen zum Vorjahr immer positiver, der weniger heiße Sommer und etwas feuchtere Herbst 2021 sorgten für mehr Niederschlag, weniger Verbrauch und Verdunstung und damit letztlich für höhere Stauinhalte als 2020.

In 2022 sind bisher höhere Stauinhalte aller Talsperren als im Vergleichszeitraum 2021 zu verzeichnen.




6. Grafiken aktueller Tagesdifferenzen der Stauinhalte

An den Graphen der jährlichen Stauinhalte lassen sich tagesweise Veränderungen nur schwer ablesen, deshalb hier die geplotteten Tagesdifferenzen der Stauinhalte der Talsperren (also immer Stauinhalt an Tag X minus Inhalt am Tag X-1):




Bemerkenswert hier das "Rechtecksignal" der Odertalsperre, eine Art "Entnahmetaktung" in den Sommer- und Herbstmonaten: etwa alle drei bis vier Tage verringert sich die Entnahme bzw der Abfluss um einen geringen, aber halbwegs konstanten Wert (~0,1 Mio m³), um dann nach weiteren vier Tagen wieder um diesen Wert zu steigen. In 2019 kann abgeschwächt ähnliches auch bei der Innerstetalsperre beobachtet werden. Ich habe keine Ahnung, was der Zweck dieser Übung sein könnte, ob dem ein natürliches Phänomen oder aktiver Regeleingriff der Harzwasserwerke (wahrscheinlicher) zugrunde liegt.

Die Tagesdifferenzen im gesamten Erfassungszeitraum:





7. Einzeldarstellungen der Talsperren

Neben den oben gezeigten Entwicklungen der Stauinhalte enthält die Datenbasis auch die Werte des Niederschlags, Zuflusses und der Unterwasser-Abgabe der einzelnen Talsperren. Für jede Talsperre habe ich diese Werte mit dem Stauinhalt in Einzeldiagrammen grafisch übereinander dargestellt (Klick öffnet die Jahresaufschlüsselung auf einer eigenen, neuen Seite):




Mir fiel beim ersten Hinsehen die zum Teil sehr unterschiedlichen Unterwasser-Abgaben auf: Grane- und Eckertalsperre haben sowohl die geringste aller sechs Unterwasser-Abgaben über die Jahre als auch die geringsten Schwankungen eben dieser.

Im Frühjahr 2022 erreichte der Pegel der Sösetalsperre mit ca. 85% seinen höchsten Stand seit zweieinhalb Jahren. Aufgrund der relativ schnell steigenden Pegel wurden Ende Januar bis Ende Februar 2022 von den Harzwasserwerken sukzessive die Unterwasserabgaben der Talsperren

  • Oder von 1,3 auf 9,5 Kubikmeter pro Sekunde,
  • Söse von 1,0 auf 3,0 m³/s,
  • Ecker von 0,0 auf 0,7 m³/s,
  • Innerste von 3,1 auf 9,8 m³/s
angehoben. Ein Balanceakt offenbar: die Talsperren sollten zum Ende des ersten Quartals optimal gefüllt sein, um genügend Volumen für die Trinkwasserversorgung und Niedrigwasseraufhöhung in trockenen Jahreszeiten vorhalten zu können, andererseits sollten Hochwässer der Flüsse solange es geht vermieden werden. Die Füllung der Stauseen sollte aber auch nicht allzu schnell erfolgen, um in Perioden intensiveren Niederschlags noch ausreichend Puffervolumen zu besitzen.

Die Pegelstände der niedersächsischen Flüsse werden auf der "Pegelstandskarte des Länderübergreifenden Hochwasser-Portals" ständig aktualisiert.

Anfang bis Mitte März 2022 wurden die Unterwasserabgaben dann wieder auf ein Normalmaß zurückgefahren, da ab Ende Februar kaum noch Niederschlag fiel. Jährliche Extremwerte der gesamten Unterwasserabgaben aller sechs Harzer Talsperren von 2019 bis 2022:

  • 2019
    Maximum am22.03.:17,1 m³/s
    Minimum am16.12.:3,5 m³/s
  • 2020
    Maximum am28.02.:17,3 m³/s
    Minimum am03.02.:3,4 m³/s
  • 2021
    Maximum am29.12.:6,3 m³/s
    Minimum am07.01.:3,6 m³/s
  • 2022
    Maximum am24.02.:27,8 m³/s
    Minimum am17.01.:5,6 m³/s




8. Statistische Vergleiche

Zur besseren Vergleichbarkeit habe ich mehrere statistische Kennzahlen der sechs Talsperren in einer Matrix zusammen dargestellt:

∅(%I)Durchschnittlicher Füllungsgrad in Prozent
S(%I)Standardabweichung Füllungsgrad
∅(N)Durchschnittlicher Niederschlag in Millimeter pro 24h
S(N)Standardabweichung vom durchschnittlichen Niederschlag
∅(Z)Durchschnittlicher Zufluss im Kubikmeter pro Sekunde
S(Z)Standardabweichung Zufluss
∅(UW)Durchschnittliche Unterwasser-Abgabe in Kubikmeter pro Sekunde
S(UW)Standardabweichung Unterwasser-Abgabe
C(Z,I)Kovarianz Zufluss zum Inhalt
C(N,Z)Kovarianz Niederschlag zum Zufluss
C(UW,I)Kovarianz Unterwasser-Angabe zum Inhalt

Die Kovarianzen können Hinweise geben, ob bei der jeweiligen Talsperre ein positiv linearer Zusammenhang z.B. zwischen Zufluss und Inhalt existiert, ob und inwieweit also bei steigendem Zufluss auch der Inhalt steigt. Man sollte allerdings diese Werte nicht über-interpretieren, da die Meßwerte nicht optimal erfassbar sind, der zeitliche Zusammenhang teils nicht linear und die Meßfrequenz sehr grob ist (Tagesbasis).

Der Wert Niederschlag wird, wie oben erwähnt, nur an der jeweiligen Talsperre direkt, nicht im gesamten Einzugsgebiet gemessen. Zwar korreliert der am Stausee gemessene Wert offensichtlich mit einem Mittelwert des gesamten Einzugsgebietes, die Korrelation Niederschlag zum Zufluss sollte jedoch genau aus diesem Grund mit Bedacht interpretiert werden.

Zum Beispiel würde ein starker, halbtägiger Regenguss als eintägiger, hoher Niederschlag gemessen werden, der resultierende Zufluss sich aber je nach Einzugsgebiet über mehrere Folgetage verteilen, selbst wenn an diesen Tagen kein Niederschlag mehr fallen sollte. Besitzt das Einzugsgebiet zudem noch relevante eigene Speicherkapazität (Moor), kann man eigentlich nur langfristige statistische Relationen bewerten.

In den folgenden Matrixdarstellungen sind die Maximalwerte innerhalb der Spalten in grün und die Minimalwerte in rot gehalten. Die Kreisgrösse deutet in etwa auf die Größe der jeweiligen Kennzahl der jeweiligen Talsperre hin. Die Zahlen des Jahres 2018 sind aufgrund der wenigen Datenpunkte mit Vorsicht zu geniessen.




Einige Muster werden offenbar: die Okertalsperre weist sowohl den höchsten durchschnittlichen Niederschlag als auch die höchste durchschnittliche Zuflussmenge auf. Gleichzeitig sind ihre Standardabweichungen in beiden Kategorien ebenfalls am höchsten; sie variieren also vergleichsweise am stärksten über den jeweiligen Zeitraum gesehen. Der durchschnittliche Stauinhalt der Okertalsperre ist der niedrigste aller sechs betrachteten Talsperren.

Die Granetalsperre dagegen fast das diametrale Gegenteil der Okertalsperre: Niederschlag und Zufluss der geringste aller Talsperren, eine relativ geringe Abweichung dieser Werte von ihrem Durchschnitt, dafür aber der höchste durchschnittliche Stauinhalt. Die Granetalsperre bezieht Wasser von der Oker- und teilweise der Innerstetalsperre; das erklärt zumindest teilweise, wieso die Granetalsperre die niedrigste Kovarianz Unterwasser-Abgabe zum Inhalt und Niederschlag zum Zufluss besitzt, wieso also der Niederschlag in ihrem Einzugsgebiet nicht oder kaum mit ihrem Zufluss korreliert.

Beide Talsperren haben in etwa den gleichen maximalen Stauinhalt, ein wie oben schon erwähnt sehr unterschiedlich großes Einzugsgebiet, die Höhe über Normalnull der Okertalsperre beträgt 416m, die der Grane 311m. Die abgehenden Flüsse unterscheiden sich ebenfalls wesentlich: die Länge der Oker bis zum Zufluss zur Aller beträgt 128,3km, die der Grane bis zur Innerste 8,9km. Die Oker fliesst durch einige Städte, die Grane mündet noch im Harz selbst in die Innerste, deren Zuflussrate von der Innerstetalsperre aus geregelt werden kann. Die Okertalsperre trägt meiner Ansicht nach also eine weit höhere "Verantwortung" für Hochwasserschutz und Niedrigwasseraufhöhung des nachgeordneten Flusses.






9. Datenaufbereitung

Die Daten der Talsperren als PDF-Datei werden täglich durch ein Python-Skript heruntergeladen, gesichert, und in einer Instanz der Open Source-Datenbank PostgreSQL gespeichert. Ein weiteres Skript erzeugt dann obige Grafiken. Insbesondere das erste Skript bevorzugt eine Linux-Umgebung, da z.B. das Werkzeugs "pdftotext" unter Linux (eigentlich unixoide Betriebssysteme) keine weiteren Vorbereitungen benötigt. Es spricht allerdings nichts dagegen, die nötigen Werkzeuge in einer WSL-, Cygwin- oder MinGW-Umgebung zu installieren und die Funktion der Skripte zu testen.

Die Python-Skripte benötigen vorinstalliert folgende, externen Module:

  • PostgreSQL: die freie Datenbank wird manchmal von den jeweiligen Linux-Dialekten standardmäßig mitinstalliert.
  • pdftotext: ein Werkzeug aus dem Unix Poppler-Paket zur Text/Layout-Extraktion aus PDF-Dateien
  • Python Module: psycopg2 (PostgreSQL), numpy (Numerik), scipy (Algorithmen), pandas (Datenanalyse) und matplotlib (Plots)

Alle Python-Module sind weit verbreitete Standards, und können z.B. mit dem Paketmanager "pip" ganz einfach heruntergeladen und installiert werden, am Shellprompt z.B. via "pip install psycopg2".

Das pdftotext-Programm ist meist Teil der poppler-utils, und kann unter diesem Namen mit dem jeweiligen Software-Management (apt, yast, pkg etc.) unter Linux, FreeBSD oder anderen heruntergeladen und installiert werden.

Beide Python-Skripte ts_get_data.py und ts_make_charts.py habe ich als Open Source (GPL3) verfasst. Die Datentabellen werden innerhalb PostgreSQL in der Datenbank "postgres", Benutzer "postgres" angelegt. Sollen die Daten woanders gespeichert werden, muss dies auf der Kommandozeile der Skripte (Option "--pgconstr") angegeben, oder direkt im Skript geändert werden. In der DB wird die parent table ts_reservoirs mit den Talsperren-Stammdaten und dem Primärschlüssel der Talsperrennummer angelegt:

create table ts_reservoirs
(
        rid             integer not null,
        name            character varying(64) not null,
        region          character varying(64),
        coordinates     point,
        maxcontent      float not null,
        maxheight       float not null,
        comments        text
);
alter table ts_reservoirs
        add constraint pk_ts_reservoirs primary key (rid);

dazu deren child table ts_levels (dort landen alle PDF-Daten):

create table ts_levels
(
        rid             integer not null,
        mtime           timestamp not null,
        rainfall        float not null,
        curcontent      float not null,
        curheight       float not null,
        influx          float not null,
        uwefflux        float not null,
        lastupdate      timestamp
);
alter table ts_levels
        add constraint fk_ts_levels foreign key (rid) references ts_reservoirs(rid);
alter table ts_levels
        add constraint ukey_ts_levels unique (rid,mtime);

und einer kleinen Tabelle der Spezifizierungen obiger Spalten:

create table ts_valuespecs
(
        valname         character varying(16) not null,
        description     character varying(64) not null,
        uom             character varying(16) not null -- unit of measure
);

Mit dem ersten Skript ts_get_data.py können obige Datenbankobjekte vor dem ersten Einlesen angelegt werden:

$> ./ts_get_data.py --initialize
WARNING: initializing the DB tables will drop all previously stored reservoir data.
Continue (y,n)? y
Successfully dropped and created 3 tables and 1 function

Die möglichen Kommandozeilenoptionen beider Skripte können wie gewohnt aufgelistet werden:

$> ./ts_get_data.py --help
usage: ts_get_data.py [-h] [--initialize] [-d] [-u] [-s [DATADIR]] [-r [DATAURL]] [-p [PGCONSTR]]
                      [-v] [-V]

Download and store daily Harz reservoir data

optional arguments:
  -h, --help            show this help message and exit
  --initialize          Initialize necessary DB structures (default: False)
  -d, --download        Download current data and store in database (default: False)
  -u, --updatedir       Update or insert the whole data directory in database (default: False)
  -s [DATADIR], --datadir [DATADIR]
                        Set data directory (default: Harzwasserwerke)
  -r [DATAURL], --dataurl [DATAURL]
                        Data url to download (default:
                        https://www.harzwasserwerke.de/talis/hochwasserdaten.pdf)
  -p [PGCONSTR], --pgconstr [PGCONSTR]
                        PostgreSQL connection string (default: dbname=postgres user=postgres)
  -v, --verbose         Be more talkative (default: False)
  -V, --version         Show script version and exit (default: False)

Die aktuelle PDF-Datei der Harzwasserwerke herunterladen, im Downloadverzeichnis sichern und die Talsperren-Werte in der DB speichern:

$> ./ts_get_data.py --download

Voreinstellung des Downloadverzeichnisses ist "Harzwasserwerke" im lokalen Verzeichnis. Wurden die DB-Tabellen neu angelegt, oder alte PDFs direkt in das Downloadverzeichnis gestellt, kann der Inhalt aller dort liegenden PDFs in die DB geladen werden:

$> ./ts_get_data.py --updatedir

Bestehende DB-Einträge werden nicht gelöscht, sondern gegebenenfalls geupdated.

Die eigentliche Erzeugung der Grafiken geschieht durch das zweite Skript ts_make_charts.py. Es erzeugt per Voreinstellung DIN A4 Grafikdateien im PNG-Format. Keine Web-Darstellung (Javascript-Klassen zur Einbettung), da diese bezüglich einer Skalierbarkeit Raster- oder Vektor-Grafikdateien eher unterlegen sind; ein schneller 1200dpi Ausdruck auf DIN A3 (Kommandozeilenoption: "ts_make_charts.py -x 420 -y 297 -d 1200", braucht zweistellig GB Ram, wenn Bitmaps gewünscht sind!) oder eine sinnvolle Darstellung auf einem 50" Monitor kann man meist komplett knicken.

Die Grafiken können entweder für den gesamten Erfassungszeitraum oder das aktuelle Jahr erzeugt werden. Mögliche Kommandozeilenparameter:

$> ./ts_make_charts.py --help
usage: ts_make_charts.py [-h] [-c [CHARTSDIR]] [-d DPI] [-f [IMAGEFORMAT]] [-m] [-p [PGCONSTR]]
                         [-s] [-t] [-x [XFIGSIZE]] [-y [YFIGSIZE]] [-v] [-V]

Create Harz reservoir data charts

optional arguments:
  -h, --help            show this help message and exit
  -c [CHARTSDIR], --chartsdir [CHARTSDIR]
                        Set charts directory (default: Harzwasserwerke/Charts)
  -d DPI, --dpi DPI     Set charts image resolution in dpi (default: 300)
  -f [IMAGEFORMAT], --imageformat [IMAGEFORMAT]
                        Set charts image format (jpg, png, svg, ...) (default: png)
  -m, --nominmax        Do not show min/max comments on chart (default: False)
  -p [PGCONSTR], --pgconstr [PGCONSTR]
                        PostgreSQL connection string (default: dbname=postgres user=postgres)
  -s, --nosumming       Do not show summed values in charts (default: False)
  -t, --thisyear        Recreate charts just for the current year (default: False)
  -x [XFIGSIZE], --xfigsize [XFIGSIZE]
                        Image width (landscape) in mm (default: 297)
  -y [YFIGSIZE], --yfigsize [YFIGSIZE]
                        Image height (landscape) in mm (default: 210)
  -v, --verbose         Be more talkative (default: False)
  -V, --version         Show script version and exit (default: False)

Ein tägliches Update (automatisch dann via cron-job, dort natürlich ohne -v) sieht hier so aus:


$> ./ts_get_data.py -vd && ./ts_make_charts.py -vt
Connected to:
PostgreSQL 11.13 (Debian 11.13-0+deb10u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
Downloaded "/mb/Harzwasserwerke/Harzwasserwerke-Talsperrendaten-2021-11-23.pdf"
Entry: Oder,0,16.96,369.36,0.46
Entry: Söse,0,16.13,317.81,0.75
Entry: Ecker,0,9.52,551.81,0.26
Entry: Oker,0,15.48,397.10,1.35
Entry: Grane,0,31.74,303.35,0.17
Entry: Innerste,0,12.42,255.47,0.84
Files read: 1, skipped: 0, records processed: 6, time: 0:00:00.427199
Connected to:
PostgreSQL 11.13 (Debian 11.13-0+deb10u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
Creating summarized charts for 2021...
Creating single reservoir charts for 2021...
Creating statistics charts for 2021...
Charts created: 18, time: 0:00:49.055829

Die Abszisse (x-Achse) der Graphen enthält fast immer die Zeit in Tagesauflösung. Da einige Meßtage fehlen (kaum Daten an Wochenenden, ich hab's verpennt, Urlaub usw.), werden vor dem Erzeugen der Grafiken und Statistiken die Werte an nicht gegebenen Tagen linear interpoliert. Das Skript liest die erforderlichen Daten aus der Datenbank, erzeugt daraus pandas DataFrames und stellt diese mit den Möglichkeiten der Python matplotlib dar.




10. Disclaimer

Alle hier gemachten Angaben und Auswertungen ohne jegliche Gewähr der Korrektheit. Die von der Harzwasserwerke GmbH übernommenen Daten sind von dieser GmbH oder anderer Seite weder geprüft noch verifiziert.




11. Kontakt

Bitte old-school nur über untenstehende Email-Adresse.

Alle Inhalte und Bilder (cc by-sa) 2021 - 2022 Michail Brzitwa, Hannover, Deutschland
Letzte Änderung: $Date: 2022-05-02 09:05:11 +0200 (Mo, 05 May 2022) $