私は、タイムゾーンの列とdatetimeの列を持つデータフレームを持っています。これらのデータをUTCに変換して他のデータと結合したい場合は、UTCから視聴者のローカルタイムゾーンに変換する計算が必要になります。Pandasは別のタイムゾーン列を使用してdatetimeを変換します
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
これは私の間違った試みでした。エラーは、 'timezone'変数が列を参照しているために真実があいまいであるということです。同じ行の値をどのように参照するのですか?
編集:データ(394,000行と22の固有のタイムゾーン)の下の回答から、いくつかの結果があります。 Edit2:誰かが結果を見たい場合に備えてgroupbyの例を追加しました。はるかに速いです。
%%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**
私はこれを答えとして投票します。私は他の答えのためにほぼ1分に対して320k行以上のサブ1秒の速度を得ています。私はちょうど誰かが私もテストすることができますgroupbyスニペットを共有することを望んでいます。 – trench