はじめに #
PandasのTimestampクラスでタイムゾーンを扱う方法をまとめた。Timestampオブジェクトにタイムゾーンを設定する方法や、異なるタイムゾーンに変換する方法について述べる。
Timestampクラスの基本については以下の記事を参照。 PandasのTimestampで時刻を扱う
以降では、ライブラリを以下のようにインストールしていることを前提とする。なお、pytzはタイムゾーンを扱うライブラリである。
import pandas as pd
import pytz
また、環境は以下の通り。
| バージョン | |
|---|---|
| Python | 3.7.4 |
| Pandas | 0.25.1 |
| pytz | 2019.3 |
Timestampクラスのタイムゾーン #
Timestampクラスのオブジェクトは、タイムゾーンの情報を持っていない状態と、持っている状態を取り得る。Pandasのリファレンスでは、前者をtz-native, 後者をtz-awareと呼ぶ。
両社の違いを以下に示す。
>>> 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.Timestampのtz引数に文字列でタイムゾーンを渡す。pd.Timestampのtz引数にpytz.timezoneオブジェクトを渡す。
文字列で設定する場合 #
pd.Timestampのtz引数にタイムゾーンを表す文字列を与えると、タイムゾーンを持つオブジェクトを作成できる。
>>> 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.Timestampのtz引数に与えると、タイムゾーンを持つオブジェクトを作成できる。
>>> 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引数にタイムゾーン情報を渡す。
>>> pd.Timestamp.now(tz="UTC")
Timestamp('2020-03-14 05:22:50.800153+0000', tz='UTC')
タイムゾーン情報の取得 #
Timestampオブジェクトのtzinfo属性からpytz.timezoneオブジェクトを取得できる。さらに、pytz.timezoneオブジェクトのzone属性からタイムゾーン文字列を取得できる。
>>> 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オブジェクトでも良い。
>>> 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を与える。
>>> 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オブジェクトでも良い。
>>> 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 |
- |