pandasで協定世界時(UTC)を日本標準時(JST)に変換
はじめに
前回の記事で、iOS標準アプリ「ヘルスケア」からデータを書き出しcsvに変換する方法を紹介しました。
ただし、このデータでは協定世界時(UTC)に準拠した日時情報が格納されています。日本標準時(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'])
活動時刻が午前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)
この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'])
午前10時ごろに出勤、午後18時ごろに退社している様子が確認できました。この日は社外の勉強会に参加して、午後10時過ぎに帰路についたようです。