今回は、Pythonの時系列の操作でタイムゾーンを扱う方法を紹介していく。
Contents
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