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**

Antworten auf die Frage(4)

Ihre Antwort auf die Frage