JavaScriptを有効にしてください

PandasのTimestampでタイムゾーンを扱う

 ·   4 min read

はじめに

PandasのTimestampクラスでタイムゾーンを扱う方法をまとめた。Timestampオブジェクトにタイムゾーンを設定する方法や、異なるタイムゾーンに変換する方法について述べる。

Timestampクラスの基本については以下の記事を参照。
PandasのTimestampで時刻を扱う

以降では、ライブラリを以下のようにインストールしていることを前提とする。なお、pytzはタイムゾーンを扱うライブラリである。

1
2
import pandas as pd
import pytz

また、環境は以下の通り。

バージョン
Python 3.7.4
Pandas 0.25.1
pytz 2019.3

Timestampクラスのタイムゾーン

Timestampクラスのオブジェクトは、タイムゾーンの情報を持っていない状態と、持っている状態を取り得る。Pandasのリファレンスでは、前者をtz-native, 後者をtz-awareと呼ぶ。
両社の違いを以下に示す。

1
2
3
4
>>> pd.Timestamp("2020/03/14") # タイムゾーン情報を持たない場合
Timestamp('2020-03-14 00:00:00')
>>> pd.Timestamp("2020/03/14", tz="Asia/Tokyo") # タイムゾーン情報を持つ場合
Timestamp('2020-03-14 00:00:00+0900', tz='Asia/Tokyo')

タイムゾーンを持ったTimestampオブジェクトの作成

タイムゾーンを持ったTimestampオブジェクトの作成する方法はいくつかあるが、ここでは以下の2つを扱う。

  • pd.Timestamptz引数に文字列でタイムゾーンを渡す。
  • pd.Timestamptz引数にpytz.timezoneオブジェクトを渡す。

文字列で設定する場合

pd.Timestamptz引数にタイムゾーンを表す文字列を与えると、タイムゾーンを持つオブジェクトを作成できる。

1
2
>>> pd.Timestamp("2020/03/14", tz="Asia/Tokyo")
Timestamp('2020-03-14 00:00:00+0900', tz='Asia/Tokyo')

指定可能なタイムゾーン文字列はpytz.all_timezonesで確認できる。

タイムゾーンの例を以下に示す。都市名や国名、または一般に良く使われる略称があてはめられている。

文字列 UTCとの時差 備考
‘America/New_York’ -5 ニューヨーク
Asia/Tokyo' +9 東京
‘EST’ -5 米国東部時間
‘Europe/Berlin’ +1* ベルリン
‘Japan’ +9 日本
‘UCT’ 0 世界標準時

* 夏時間の場合は+2

pytz.timezoneオブジェクトで設定する場合

pytz.timezoneにタイムゾーンを表す文字列を与え、さらにpd.Timestamptz引数に与えると、タイムゾーンを持つオブジェクトを作成できる。

1
2
3
>>> jst = pytz.timezone("Asia/Tokyo") 
>>> pd.Timestamp("2020/03/14", tz=jst)
Timestamp('2020-03-14 00:00:00+0900', tz='Asia/Tokyo')

タイムゾーンを持った現在時刻を取得

タイムゾーンを持つ現在時刻を取得する場合は、pd.Timestamp.now()tz引数にタイムゾーン情報を渡す。

1
2
>>> pd.Timestamp.now(tz="UTC")
Timestamp('2020-03-14 05:22:50.800153+0000', tz='UTC')

タイムゾーン情報の取得

Timestampオブジェクトのtzinfo属性からpytz.timezoneオブジェクトを取得できる。さらに、pytz.timezoneオブジェクトのzone属性からタイムゾーン文字列を取得できる。

1
2
3
4
5
>>> t = pd.Timestamp("2020/03/14", tz="Asia/Tokyo")
>>> t.tzinfo
<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>
>>> t.tzinfo.zone
'Asia/Tokyo'

タイムゾーンの変換

タイムゾーンがあるTimestampオブジェクトを異なるタイムゾーンに変換するには、tz_convertメソッドを用いる。tz_convertの引数は文字列でもpytz.timezoneオブジェクトでも良い。

1
2
3
>>> t = pd.Timestamp("2020/03/14", tz="Asia/Tokyo")
>>> t.tz_convert("UTC")
Timestamp('2020-03-13 15:00:00+0000', tz='UTC')

タイムゾーンがあるTimestampオブジェクトからタイムゾーン情報を削除する場合、2つの方法がある。UCT時刻に変換してからタイムゾーンを削除するには、tz_convertメソッドの引数にNoneを与える。また、現地時刻のままタイムゾーンを削除するには、tz_localizeメソッドの引数にNoneを与える。

1
2
3
4
5
>>> t = pd.Timestamp("2020/03/14", tz="Asia/Tokyo")
>>> t.tz_convert(None)
Timestamp('2020-03-13 15:00:00')
>>> t.tz_localize(None)
Timestamp('2020-03-14 00:00:00')

タイムゾーンがないTimestampオブジェクトにタイムゾーンを設定するには、tz_localizeメソッドを用いる。tz_localizeの引数は文字列でもpytz.timezoneオブジェクトでも良い。

1
2
3
>>> t = pd.Timestamp("2020/03/14")
>>> t.tz_localize("Asia/Tokyo")
Timestamp('2020-03-14 00:00:00+0900', tz='Asia/Tokyo')

以上の変換をまとめると、以下の表となる。

変換前/変換後 tzあり tzなし
tzあり tz_convert tz_convert/tz_localize
tzなし tz_localize -

参考

pandas.Timestamp — pandas 1.2.0 documentation

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です