はじめに #
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 |
- |