u++の備忘録

pandasで協定世界時(UTC)を日本標準時(JST)に変換

はじめに

前回の記事で、iOS標準アプリ「ヘルスケア」からデータを書き出しcsvに変換する方法を紹介しました。

upura.hatenablog.com

ただし、このデータでは協定世界時(UTC)に準拠した日時情報が格納されています。日本標準時(JST)で過ごしている人が日次単位の集計を実施する際は、協定世界時日本標準時に変換するのが望ましいです。

本記事では、前回作成したcsvをpandasで読み込み、新たに日本標準時(JST)の列を作る方法をまとめました。

既存データ(協定世界時)を眺める

最初に、実際に日時情報が協定世界時で格納されていると確認してみます。

df_test = pd.read_csv('../data/input/df.csv')
df_test['datetime'] = pd.to_datetime(df_test['datetime'])

df_test['date'] = df_test['datetime'].dt.date
df_test['time'] = df_test['datetime'].dt.time

データは、普通の平日の1日分に絞り込んでおきます。また、その日のうちの累積の歩数を可視化することにします。

from datetime import date
df_test = df_test[df_test['date'] == date(2019, 1, 22)]
df_test['cumsumStepCount'] = df_test['stepCount'].cumsum()
plt.figure(figsize=(25, 12))
plt.rcParams["font.size"] = 18
plt.ylabel('cumsumStepCount')
plt.plot(df_test['time'], df_test['cumsumStepCount'])

f:id:upura:20190206114857p:plain

活動時刻が午前0時から午後2時あたりの範囲に収まっています。この日は、通常の平日と同様に出勤と退勤をしていたので、この時刻が日本標準時ではないと分かりました。

日本標準時に変換

まず、csvを読み込む段階で index_col に日時情報の列を指定しておきます。これは後述する日本標準時に変換するメソッドが、indexに対して実行しないとエラーが出る*1ためです。

df = pd.read_csv('../data/input/df.csv', index_col='datetime')
df.index = pd.to_datetime(df.index, utc=True)

f:id:upura:20190206115721p:plain

このindexを基に、日本標準時(JST)に変換した列を作成します。もちろんindexを上書きしても良いと思います。

df['datetimeja'] = df.index.tz_convert('Asia/Tokyo')

あとは、先ほどと同様の条件で可視化してみます。

df['date'] = df['datetimeja'].dt.date
df['time'] = df['datetimeja'].dt.time

df = df[df['date'] == date(2019, 1, 22)]
df['cumsumStepCount'] = df['stepCount'].cumsum()
plt.figure(figsize=(25, 12))
plt.rcParams["font.size"] = 18
plt.ylabel('cumsumStepCount')
plt.plot(df['time'], df['cumsumStepCount'])

f:id:upura:20190206120029p:plain

午前10時ごろに出勤、午後18時ごろに退社している様子が確認できました。この日は社外の勉強会に参加して、午後10時過ぎに帰路についたようです。

おわりに

本記事では、協定世界時に準拠した日時情報が格納されたcsvをpandasで読み込み、新たに日本標準時の列を作る方法をまとめました。

そもそも日次単位のデータをきちんと眺めないと、日時情報が協定世界時で格納されていると知らないままに分析してしまう事態にもなりかねません。改めて、データの仕様を把握する必要性を実感する事例でした。