メインコンテンツへスキップ

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

·1568 文字·4 分
目次

はじめに
#

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.Timestamptz引数に文字列でタイムゾーンを渡す。
  • pd.Timestamptz引数にpytz.timezoneオブジェクトを渡す。

文字列で設定する場合
#

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

>>> 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引数に与えると、タイムゾーンを持つオブジェクトを作成できる。

>>> 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 -

参考
#

pandas.Timestamp — pandas 1.2.0 documentation

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

PandasのTimestampで時刻を扱う
·2140 文字·5 分
PandasのTimestampを使った時刻の生成や、時刻オブジェクトからの属性の取得、任意形式の文字列での出力について述べる。
辞書内包表記でPandasのSeries, DataFrameを作成
·1056 文字·3 分
辞書内包表記を使って、PandasのSeries, DataFrameを少ないコード量で作成する。
PandasのSeriesとDataFrameの作成
·1427 文字·3 分
Pandasの基本データ構造であるSeriesとDataFrameの作成方法について述べる。
pandas.Seriesのcorrメソッドで時系列データの相関係数を求める際の注意点
·1294 文字·3 分
pandas.Seriesのcorrメソッドで時系列データの相関係数を求めるときにはshiftメソッドで時刻をずらします。
Pythonのデコレータで関数に処理を追加する
·1104 文字·3 分
Pythonで関数の前後に処理を追加する、デコレータと呼ばれる機能について簡単にまとめた。
Pythonとseleniumを使ったブラウザ操作自動化
·2605 文字·6 分
ウェブUIのテストツールであるseleniumを使った、ブラウザ操作の自動化についてまとめた。