今回は、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