Pandas konvertiert datetime mit einer separaten Zeitzonenspalte
Ich habe einen Datenrahmen mit einer Spalte für die Zeitzone und einer Spalte für die Datums- und Uhrzeitangabe. Ich möchte diese zuerst in UTC konvertieren, um sie mit anderen Daten zu verbinden, und dann werde ich einige Berechnungen haben, um sie schließlich von UTC in die lokale Zeitzone des Betrachters zu konvertieren.
datetime time_zone
2016-09-19 01:29:13 America/Bogota
2016-09-19 02:16:04 America/New_York
2016-09-19 01:57:54 Africa/Cairo
def create_utc(df, column, time_format='%Y-%m-%d %H:%M:%S'):
timezone = df['TZ']
df[column + '_utc'] = df[column].dt.tz_localize(timezone).dt.tz_convert('UTC').dt.strftime(time_format)
df[column + '_utc'].replace('NaT', np.nan, inplace=True)
df[column + '_utc'] = pd.to_datetime(df[column + '_utc'])
return df
Das war mein fehlerhafter Versuch. Der Fehler ist, dass die Wahrheit mehrdeutig ist, was Sinn macht, weil die Variable 'timezone' auf eine Spalte verweist. Wie beziehe ich mich auf den Wert in derselben Zeile?
Edit: Hier sind einige Ergebnisse aus den nachstehenden Antworten zu einem Datentag (394.000 Zeilen und 22 eindeutige Zeitzonen). Edit2: Ich habe ein Gruppenbeispiel hinzugefügt, falls jemand die Ergebnisse sehen möchte. Es ist mit Abstand das schnellste.
%%timeit
for tz in df['TZ'].unique():
df.ix[df['TZ'] == tz, 'datetime_utc2'] = df.ix[df['TZ'] == tz, 'datetime'].dt.tz_localize(tz).dt.tz_convert('UTC')
df['datetime_utc2'] = df['datetime_utc2'].dt.tz_localize(None)
1 loops, best of 3: 1.27 s per loop
%%timeit
df['datetime_utc'] = [d['datetime'].tz_localize(d['TZ']).tz_convert('UTC') for i, d in df.iterrows()]
df['datetime_utc'] = df['datetime_utc'].dt.tz_localize(None)
1 loops, best of 3: 50.3 s per loop
df['datetime_utc'] = pd.concat([d['datetime'].dt.tz_localize(tz).dt.tz_convert('UTC') for tz, d in df.groupby('TZ')])
**1 loops, best of 3: 249 ms per loop**