Matplotlib und Zeitzonen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Schönen Guten Tag

Ich hab einen Datensatz dessen Index als 'Europe/Paris' definiert ist; dtype='datetime64[ns, Europe/Paris]'
Der Datensatz kann richtig nach Zeiten geschnitten werden; Datensatz.between_time(''01:00am', '02.00am)).
ABER werden die Werte mittels Matplotlib aufgetragen, so sind sie um 2 Stunden versetzt, also zeigt die X-Achse 23:00 bis 24:00 Uhr an, anstatt 1:00 usw..
Leider ist es mir nicht gelungen die Zeitzone im Code zu definieren (tz = 'Europe/Paris'), hier bekomme ich diverse Fehler, bsp: "'Line2D' object has no property 'tz'"
Ich konnte das Problem lösen indem ich die Default Einstellungen der 'matplotlibrc' geändert habe. Diese Lösung gefällt mir aber nicht :/

Somit hab ich drei Fragen :)
  • Wie kann ich direkt beim Auftragen der Daten darauf hinweisen, dass diese bereits 'Europe/Paris' sind?
  • Warum habe ich zwei Stunden unterschied zu UTC, wo es aktuell im Winter nur 1 Stunde sein sollte?
  • Mache ich generell etwas ungeschicktes?
Würd mich über Rückmeldungen freuen, danke

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.dates as mdates

datum = [1666610933160, 1666610933160, 1666610935175, 1666610935175, 1666611168999]
wert = np.linspace(0,10,len(datum))
beispiel = pd.DataFrame(data=wert, index=datum)
beispiel.index = pd.to_datetime(beispiel.index, unit='ms', utc=True).map(lambda x: x.tz_convert('Europe/Paris'))

fig, ax = plt.subplots()
ax.plot(beispiel, 'xr')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.xticks(rotation = 90)

b = ['echte X-Achsenwerte:']
for k in beispiel.index:
    a = str(k)[:19]
    b.append(a)
idx_als_str_liste = '\n'.join(b)   
    
fig.text(0.7,0.5, idx_als_str_liste, horizontalalignment='left', verticalalignment='center', fontsize = '16')
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OWT: Wenn Du es nicht global angeben willst, musst Du es eben lokal machen, also hier dem `DateFormatter` die Zeitzone mitgeben. Das mag auf den ersten Blick redundant erscheinen, dass man beim Plot explizit eine Zeitzone angeben muss, wo doch die Daten schon eine haben, aber a) muss die Zeitzone dort ja nicht der Zeitzone entsprechen mit der man den Plot beschriften möchte, und spätestens wenn man im Plot mehr als eine Datenreihe hat wo jede eine eigene/andere Zeitzone hat, stellt sich die Frage welche Zeitzone für die Beschriftung gewählt werden soll. Die Verarbeitung der Daten sind hier sauber von der Darstellung getrennt.

Was *jetzt* für ein Versatz zu UTC in Europe/Paris ist, hat doch keinen Einfluss darauf was im *Oktober* war. Bis zum 30. Oktober war dort Sommerzeit, also 2h Versatz, also haben das die Zeitangaben am 24.10. logischerweise auch.

Es global zu ändern heisst übrigens nicht zwangsläufig die `matplotlibrc`-Konfigurationsdatei zu ändern. Man kann das ja auch global für jeden einzelnen Prozess über `matplotlib.rcParams` ändern.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Vielen dank für die Antwort und vielen Dank das du das mit der Sommerzeit und Oktober gesehen hast :)

Ich möchte auf jeden Fall eine Lösung die innerhalb eines Skripts läuft. Aber leider scheiterts am Syntax, wie die Zeitzone mitgegeben wird!

ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M', tz='Europe/Paris')) --> TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M', tz=[Europe/Paris])) --> NameError: name 'Europe' is not defined

prinzipiell müsste ich "tz=" sowohl bei .plot wie bei DateFormatter machen können, aber leider ...

Hast du mir vll ein Beispiel? Ich finde leider auch keines dass ich zum laufen bekomme

Danke
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wirklich nicht? Die Fehlermeldung einfach mal in google werfen produziert https://stackoverflow.com/questions/230 ... o-variable, das sollte sich doch machen lassen, oder?
Antworten