今回は、複数の時系列データでそれぞれが別のタイムゾーンを持つ場合、それらのデータを演算した結果がどうなるのかを見ていこう。

まず、以下のような10日間の日付範囲があるとする。

import pandas as pd
import numpy as np

date_rng = pd.date_range('10/17/2019 21:00', periods=10, freq='B')
# DatetimeIndex(['2019-10-17 21:00:00', '2019-10-18 21:00:00',
#                '2019-10-21 21:00:00', '2019-10-22 21:00:00',
#                '2019-10-23 21:00:00', '2019-10-24 21:00:00',
#                '2019-10-25 21:00:00', '2019-10-28 21:00:00',
#                '2019-10-29 21:00:00', '2019-10-30 21:00:00'],
#               dtype='datetime64[ns]', freq='B')

ts = pd.Series(np.random.randn(len(date_rng)), index=date_rng)
# 2019-10-17 21:00:00   -0.225737
# 2019-10-18 21:00:00   -0.285423
# 2019-10-21 21:00:00   -1.360346
# 2019-10-22 21:00:00    1.929381
# 2019-10-23 21:00:00   -0.237410
# 2019-10-24 21:00:00   -0.600526
# 2019-10-25 21:00:00   -1.399074
# 2019-10-28 21:00:00   -2.491753
# 2019-10-29 21:00:00    0.588928
# 2019-10-30 21:00:00   -0.564150
# Freq: B, dtype: float64

これをスライシングで二つの時系列データに分割し、それぞれ別のタイムゾーンを設定する。

ts1 = ts[:7].tz_localize('Asia/Tokyo')
# 2019-10-17 21:00:00+09:00   -0.225737
# 2019-10-18 21:00:00+09:00   -0.285423
# 2019-10-21 21:00:00+09:00   -1.360346
# 2019-10-22 21:00:00+09:00    1.929381
# 2019-10-23 21:00:00+09:00   -0.237410
# 2019-10-24 21:00:00+09:00   -0.600526
# 2019-10-25 21:00:00+09:00   -1.399074
# Freq: B, dtype: float64

ts2 = ts1[2:].tz_convert('Europe/London')
# 2019-10-21 13:00:00+01:00   -1.360346
# 2019-10-22 13:00:00+01:00    1.929381
# 2019-10-23 13:00:00+01:00   -0.237410
# 2019-10-24 13:00:00+01:00   -0.600526
# 2019-10-25 13:00:00+01:00   -1.399074
# Freq: B, dtype: float64

この二つの時系列データを演算した場合、結果として得られる時系列データのタイムゾーンはUTCに変換される。

result = ts1 + ts2

result.index
# DatetimeIndex(['2019-10-17 12:00:00+00:00', '2019-10-18 12:00:00+00:00',
#                '2019-10-21 12:00:00+00:00', '2019-10-22 12:00:00+00:00',
#                '2019-10-23 12:00:00+00:00', '2019-10-24 12:00:00+00:00',
#                '2019-10-25 12:00:00+00:00'],
#               dtype='datetime64[ns, UTC]', freq='B')