Python の日付と時刻のフォーマット
Python で日付と時刻を扱うための基本的なモジュールは datetime です。
ここでは datetime オブジェクトを取得してから、それを任意の日付あるいは時刻にフォーマットして出力する方法について紹介します。
ついでに、datetime でタイムゾーンを扱うときの注意点についても説明します。
Python の strftime による日付と時刻のフォーマット
datetime オブジェクトをフォーマットして出力するには、strftime 関数が使えます。 strftime 関数に任意のフォーマット文字列を渡すことで、同じ datetime オブジェクトから様々の形にフォーマットすることができます。
カテゴリ | フォーマット文字 | 意味 |
---|---|---|
年 | %Y | 年を4桁表示 |
%y | 年を2桁表示 | |
月 | %m | 月を左側ゼロ埋めで 2 桁表示 |
%B | 月を表す文字を表示 (例: "April") | |
%b | 月を表す文字を省略表示 (例: "Apr") | |
曜日 | %A | 曜日表す文字を表示 (例: "Sunday") |
%a | 曜日を表す文字を省略表示 (例: "Sun") | |
%w | 曜日を表す数字。日曜日 0, 月曜 1, ... | |
週数 | %U | 週数 (日曜日始まり) |
%W | 週数 (月曜日始まり) | |
日 | %d | 日付 (月初起点の日数) |
%j | 1月1日起点の日数 | |
時刻 | %H | 24時間表示の時間 |
%j | 12時間表示の時間 | |
%p | AM または PM | |
%M | 分 | |
%S | 秒 | |
%f | マイクロ秒 | |
タイムゾーン | %Z | タイムゾーン略称 (例: "JST", "PDT" など) |
%z | UTC からのオフセット ±hhmm | |
省略形 | %c | 日付と時刻表示 |
%x | 日付表示 | |
%X | 時刻表示 |
2桁表示でゼロ埋めにしない方法
上記のフォーマット文字で二桁表示のところは全て律儀に、左側ゼロ埋めで二桁で表示されます。例えば 4月を表す場合に %m とすると 04 となります。
もし 04 ではなく 4 としたい場合は、%-m のようにハイフンを付けます。
pytz のインストール
Python でタイムゾーンを利用する場合は、 pytz モジュールを利用するのが便利です。pytz を使うとタイムゾーンの標準のデータベースである tz database を使えるようになります。
pytz はpip でインストールできます。
pip install pytz
datetime にタイムゾーンを設定する
datetime にタイムゾーンを設定する場合は、datetime 関数の tzinfo パラメータで設定すると、 タイムゾーンが LMT になりオフセットが一般的な形で返りません。
この場合は pytz の localize 関数でオブジェクトを再作成すると、一般的な形で取得できます。下記のサンプルコードをみてください (下記サンプルコードの9-10行目)。
Python の日付と時刻のフォーマットのサンプルコード
以上で説明したフォーマット文字とタイムゾーンを使った例を示します。ついでにタイムスタンプも取得しています。
print() の横に記載したコメントに出力を記載しました。
from datetime import datetime
import pytz
# Timezone
tz = pytz.timezone('America/Los_Angeles')
# tz = pytz.timezone('Japan')
# datetime(year, month, day, hour, min, sec)
dt = datetime(2017, 4, 30, 14, 30, 45)
d = tz.localize(dt)
# Year (%y, %Y)
print(d.strftime('%y\t%Y')) # 17 2017
# Month (%B, %b, %m)
print(d.strftime('%B\t%b\t%m\t%-m')) # April Apr 04 4
# Weekday (%A, %a, %w)
print(d.strftime('%A\t%a\t%w')) # Sunday Sun 0
# Week Number (%U, %W)
print(d.strftime('%U\t%W')) # 18 17
# Day (%d)
print(d.strftime('%d\t%-d\t%j')) # 30 30 120
# Hour (%H, %I)
print(d.strftime('%H\t%I\t%-I\t%p')) # 14 02 2 PM
# Min, Sec, micro-sec (%M, %S, %f)
print(d.strftime('%M\t%S\t%f')) # 30 45 000000
# Timezone (Timezone name, UTF offset)
print(d.strftime('%Z\t%z')) # PDT -0700
# Timestamp
ts = int(d.timestamp())
print(f'Timestamp {ts}') # Timestamp 1493587845
# "appropriate" representation
print(d.strftime('%c')) # Sun Apr 30 14:30:45 2017
print(d.strftime('%x %X')) # 04/30/17 14:30:45
######################################
# US Common
print(d.strftime('%-m/%-d/%Y %-I:%M %p')) # 4/30/2017 2:30 PM
# ISO8601
print(d.strftime('%Y-%m-%dT%H:%M%z')) # 2017-04-30T14:30-0700
上では ISO8601 形式にも表示しています。ISO8601 については「ISO8601 フォーマットの日付を読み取る方法」も参考にしてください。
以上、datetime を自在にフォーマットする方法について説明しました。