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 になりオフセットが一般的な形で返りません。

この場合は pytzlocalize 関数でオブジェクトを再作成すると、一般的な形で取得できます。下記のサンプルコードをみてください (下記サンプルコードの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 を自在にフォーマットする方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門