今回は、Pythonの時系列の操作でタイムゾーンを扱う方法を紹介していく。
コンテンツ
pytzライブラリでタイムゾーン情報を参照する
Pythonでタイムゾーン情報を扱う場合、サードパーティ製のpytzライブラリを使用する。
pytzライブラリは、オルソンデータベースと言われる世界のタイムゾーン情報を集めたものをPythonで使用できるようにするライブラリだ。
使い方はまず、import文でpytzライブラリを呼び出し、common_timezonesを参照するとタイムゾーンの一覧を確認することができる。
import pytz
pytz.common_timezones[:]
# ['Africa/Abidjan',
# 'Africa/Accra',
# 'Africa/Addis_Ababa',
# ...
# 'US/Pacific',
# 'UTC']
timezoneメソッドを使うことで、pytzからタイムゾーンオブジェクトを取得する。
pytz.timezone( 'Asia/Tokyo')
# <DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>
pandasでタイムゾーンを扱う
pandasの時系列は、デフォルトではタイムゾーンに関して明確に管理されていない。
以下のpandasデータを見てみよう。
import pandas as pd
import numpy as np
date_rng = pd.date_range('10/14/2019 9:30', periods=6, freq='D')
# DatetimeIndex(['2019-10-14 09:30:00', '2019-10-15 09:30:00',
# '2019-10-16 09:30:00', '2019-10-17 09:30:00',
# '2019-10-18 09:30:00', '2019-10-19 09:30:00'],
# dtype='datetime64[ns]', freq='D')
ts = pd.Series(np.random.randn(len(date_rng)), index=date_rng)
# 2019-10-14 09:30:00 -1.219324
# 2019-10-15 09:30:00 1.523653
# 2019-10-16 09:30:00 -0.133778
# 2019-10-17 09:30:00 0.844499
# 2019-10-18 09:30:00 0.931930
# 2019-10-19 09:30:00 2.067498
# Freq: D, dtype: float64
インデックスオブジェクトのタイムゾーン(tz)を確認するとNoneとなっている。
print(ts.index.tz)
# None
先述のコードでdate_rangeを使って日付範囲を生成したが、この時タイムゾーンを指定して生成することができる。
pd.date_range('10/14/2019 9:30', periods=6, freq='D', tz='UTC')
# DatetimeIndex(['2019-10-14 09:30:00+00:00', '2019-10-15 09:30:00+00:00',
# '2019-10-16 09:30:00+00:00', '2019-10-17 09:30:00+00:00',
# '2019-10-18 09:30:00+00:00', '2019-10-19 09:30:00+00:00'],
# dtype='datetime64[ns, UTC]', freq='D')
指定のタイムゾーンへローカライズする
また、既に生成された「タイムゾーンがNone」となっているデータに対し、tz_localizeメソッドを使うことで、ローカライズされたデータを生成することもできる。
ts
# 2019-10-14 09:30:00 -1.219324
# 2019-10-15 09:30:00 1.523653
# 2019-10-16 09:30:00 -0.133778
# 2019-10-17 09:30:00 0.844499
# 2019-10-18 09:30:00 0.931930
# 2019-10-19 09:30:00 2.067498
# Freq: D, dtype: float64
ts_utc = ts.tz_localize('UTC')
# 2019-10-14 09:30:00+00:00 -1.219324
# 2019-10-15 09:30:00+00:00 1.523653
# 2019-10-16 09:30:00+00:00 -0.133778
# 2019-10-17 09:30:00+00:00 0.844499
# 2019-10-18 09:30:00+00:00 0.931930
# 2019-10-19 09:30:00+00:00 2.067498
# Freq: D, dtype: float64
print(ts_utc.index.tz)
# UTC
別のタイムゾーンに変換する
特定のタイムゾーンにローカライズされたデータを、別のタイムゾーンに変換する場合は、tz_convertメソッドを使う。
ts_tokyo = ts_utc.tz_convert('Asia/Tokyo')
# 2019-10-14 18:30:00+09:00 -1.219324
# 2019-10-15 18:30:00+09:00 1.523653
# 2019-10-16 18:30:00+09:00 -0.133778
# 2019-10-17 18:30:00+09:00 0.844499
# 2019-10-18 18:30:00+09:00 0.931930
# 2019-10-19 18:30:00+09:00 2.067498
# Freq: D, dtype: float64
print(ts_tokyo.index.tz)
# Asia/Tokyo