Blow Up by Black Swan

Python-文字列型の時刻を解析し、異なるタイムゾーンの時刻に変換

今回は、pythonにおける時刻の取り扱いについてです。文字列型の時刻情報を解析し、異なるタイムゾーンに変換する一連のコードになります。

1.基本情報と利用するモジュール(datetime、pytz)

基本情報は以下になります。

前提: 文字列型の時刻が与えられている
必要なモジュール: datetimeモジュール, pytzモジュール

datetimeモジュールはpythonの標準ライブラリの1つであり、基本的な時刻情報の取り扱いに利用されるモジュールです。pytzモジュールは、タイムゾーン間での時刻の変換に主に利用されるサードバーティライブラリの1つであり、利用する場合は下記のように別途インストールする必要があります。

~$ pip install pytz

また、datetime型には2つの特徴、”naive”と”aware”があり、どちらかの特徴を持ちます。”naive”がその名が示す通り、純粋に時間を表していものであり、タイムゾーンやサマータイムなどの情報は持ちません。標準ライブラリでは、国や場所との関連性を掴めるような相対性を持たない、といった旨の説明がなされいます。

一方で、”aware”は、”naive”とは異なり、タイムゾーンなどの他の時刻や情報との関連性を掴める情報を持つ時刻オブジェクトです。今回では、str型の時刻を解析した時点では、naiveなオブジェクトになっているため、これをawareなオブジェクトに変換する手続きが必要となります。

2.流れ

コード組み立ての上での流れはそれぞれ以下になります。

【フロー】

  1. str時刻の解析
    1. datetime.strptimeメソッドで時刻を解析 -> datetime型(naive)
  2. 時刻オブジェクトをnaiveからawareに変換
    1. pytz.timezoneメソッドでタイムゾーン情報を持ったオブジェクトを作成(->tzfile型)
      • ※ UTC(標準世界時)の場合はpytz.utc属性でオブジェクトを作成できる(->UTC型)
    2. tzfileオブジェクト.localizeメソッドで、naiveな時刻オブジェクトを”aware”な時刻オブジェクトに変更(->datetimeオブジェクトは不変)
  3. 指定したタイムゾーンに時刻を変換
    1. pytz.timezoneメソッドで変更したいタイムゾーンのインスタンスを作成(->tzfile型)
    2. datetimeオブジェクト.astimezoneメソッドで時刻を変換(->datetime型)

3.コード

具体的なコードは以下になります。今回は標準世界時(イギリスの時間)で表されているものを東京の時刻に変換します。

#標準世界時で表されている、文字列型の時刻を東京の時刻に変換
#"2018-07-07 10:59:58.417000"(標準世界時)
#  --> 2018-07-07 19:59:58.417000(タイムゾーン東京UTC+9:00)
import datetime, pytz

ex_time = "2018-07-07 10:59:58.417000"  #->str型

#1. str時刻の解析
ex_datetime = datetime.datetime.strptime(ex_time, '%Y-%m-%d %H:%M:%S.%f')  # -> datetime型
#確認用: print(ex_datetime) -> 2018-07-07 10:59:58.417000(※datetime型に変わっている)

#2. datetimeオブジェクトをnaiveからawareなものに変換
utc_timezone = pytz.timezone('UTC')  # -> tzfileオブジェクト(標準世界時のタイムゾーン情報を持つ)
utc_time = utc_timezone.localize(ex_datetime)  # -> datetime型は不変(タイムゾーン情報が付与されたawareなオブジェクトに変換されている)
#確認用: print(utc_time) -> 2018-07-07 10:59:58.417000+00:00(※+00:00というタイムゾーン情報が追加されている)

#3. 指定したタイムゾーンに変換
tokyo_timezone = pytz.timezone('Asia/Tokyo')  # -> tzfileオブジェクト(Tokyoのタイムゾーン情報を持つ)
tokyo_time = utc_time.astimezone(tokyo_timezone)  # -> datetime型は不変(※東京の時刻帯に変換されている)
print(tokyo_time)
# -> 2018-07-07 19:59:58.417000+09:00

欧米などで採用されているサマータイムを扱う場合は、astimezoneメソッドに加え、nomalizeメソッドも合わせて利用する必要があります。また、今回は、UTC時間(+00:00)を東京(日本)時間に変えていますが、もとがモスクワやアムステルダムなどでも同じようにコードを組むだけで、変換できます。都度UTC時間に変えずとも、時刻の変換はできます。

4.活用したモジュール・メソッド、参考サイト

今回活用したモジュール・メソッドは以下になります。

  • datetimeモジュール…python標準ライブラリ・モジュール。標準的な日付を取り扱う。
    • datetime.datetime.strptime(‘str型時刻’, ‘解析フォーマット’)…解析フォーマットに沿って文字列型データを解析
  • pytzモジュール…タイムゾーンの変換に利用されるモジュール
    • pytz.timezone(‘タイムゾーン’)…タイムゾーン情報を持ったtzfileオブジェクトを生成
    • tztimeオブジェクト.localize(datetimeオブジェクト)…naiveなdatetimeオブジェクトを、タイムゾーン情報を持ったawareなdatetimeオブジェクトに変換
    • awareなdatetimeオブジェクト.astimezone(tzfileオブジェクト)…tzfileオブジェクトの情報に沿った時刻に変換

参考サイトは以下です。