Python Pandas: Unterstützung von 25 Stunden im Datetime Index

Aug 16 2020

Ich möchte ein Datum / eine Uhrzeit als Index für einen Datenrahmen in Pandas verwenden.

Die Sommerzeit wird in der Datenbank jedoch nicht richtig behandelt, sodass die Datums- / Zeitwerte für den Tag, an dem die Sommerzeit endet , 25 Stunden betragen und als solche dargestellt werden:

2019102700
2019102701
...
2019102724

Ich verwende den folgenden Code, um diese Werte in ein DateTimeObjekt zu konvertieren, das ich als Index für einen Pandas-Datenrahmen verwende:

df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H")

Dies führt jedoch zu einem Fehler:

ValueError: unconverted data remains: 4

Vermutlich, weil die to_datetimeFunktion die Stunde nicht erwartet 24. Ebenso hat der Tag, an dem die Sommerzeit beginnt, nur 23 Stunden.

Eine Lösung, an die ich dachte, war das Speichern der Daten als Zeichenfolgen, aber das scheint weder elegant noch effizient zu sein. Gibt es eine Möglichkeit, das Problem der Sommerzeit bei der Verwendung zu lösen to_datetime?

Antworten

1 MrFuppes Aug 16 2020 at 18:40

Wenn Sie die Zeitzone kennen, können Sie hier die UTC-Zeitstempel berechnen. Analysieren Sie nur den Datumsteil, lokalisieren Sie die tatsächliche Zeitzone, zu der die Daten "gehören", und konvertieren Sie diese in UTC. Jetzt können Sie den Stunden-Teil analysieren und als Zeitdelta hinzufügen - z

import pandas as pd 

df = pd.DataFrame({'date_time_str': ['2019102722','2019102723','2019102724',
                                     '2019102800','2019102801','2019102802']})

df['date_time'] = (pd.to_datetime(df['date_time_str'].str[:-2], format='%Y%m%d')
                   .dt.tz_localize('Europe/Berlin')
                   .dt.tz_convert('UTC'))

df['date_time'] += df['date_time_str'].str[-2:].astype('timedelta64[h]')

# df['date_time']
# 0   2019-10-27 20:00:00+00:00
# 1   2019-10-27 21:00:00+00:00
# 2   2019-10-27 22:00:00+00:00
# 3   2019-10-27 23:00:00+00:00
# 4   2019-10-28 00:00:00+00:00
# 5   2019-10-28 01:00:00+00:00
# Name: date_time, dtype: datetime64[ns, UTC]
1 hoomant Aug 16 2020 at 17:43

Ich bin mir nicht sicher, ob es die eleganteste oder effizienteste Lösung ist, aber ich würde:

df.loc[df.date_time.str[-2:]=='25', 'date_time'] = (pd.to_numeric(df.date_time[df.date_time.str[-2:]=='25'])+100-24).apply(str)
df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H")