微忘録

好奇心に記憶力がついていかない人のブログ

pandasでtimezoneを含むstringレコードをdatetimeに型変換する方法

pandasのto_datetime()関数はtimezoneフォーマットの%zに対応していなかったので、解決策を備忘録。

t.co

github.com

解決策

今回はnginxログで23/Apr/2018:14:21:43 +0000 形式の文字列を例として用います。 解決方法は要は、datetime.strptime()関数で推論できる状態に整えてから、to_datetime()関数に与えてあげます。

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'datetime_like_column' : pd.Series(['23/Apr/2018:14:21:43 +0000', '29/Dec/2018:03:36:27 +0000'])})

f = lambda x: datetime.strptime(x, '%d/%b/%Y:%H:%M:%S %z')

#datetimeもしくはdate型かつタイムゾーンはutc指定
df['datetime_like_column_as_datetime'] = pd.to_datetime(df['datetime_like_column'].apply(f), utc=True)
df['datetime_like_column_as_date'] = pd.to_datetime(df['datetime_like_column'].apply(f), utc=True).dt.date
df
datetime_like_column datetime_like_column_as_datetime datetime_like_column_as_date
0 23/Apr/2018:14:21:43 +0000 2018-04-23 14:21:43+00:00 2018-04-23
1 29/Dec/2018:03:36:27 +0000 2018-12-29 03:36:27+00:00 2018-12-29

終わりに

今回扱った問題はpandas の major release 0.24.0 で修正されるようです。 f:id:wtnVenga:20190107005004p:plain

また、同一カラムに複数のtimezoneがある場合の変換方法については、以下をご参照ください。 (indexカラムとして扱うことで攻略できるらしいです)

note.nkmk.me