趣味の開発ノート

ITの学習やプログラミング・ノーコードアプリ開発のことなど。

【Python】時間や日時の表現 - time・datetime

本記事は、過去に他のブログで書いたものを引っ越ししてきた記事になります。

Pythonで時間や日時を扱うtimeモジュールとdatetimeモジュールについて、よく利用する操作を自分用にまとめました。必要に応じて追記していきます。

時間や日時を表すモジュール

Pythonで時間や日時に関する処理を行うモジュールには、よく使うものにtimeとdatetimeがあります。

docs.python.org

docs.python.org

主なデータ型

これらのモジュールを使って扱う主なデータ型は、次のように整理できます。

呼称 データ型 モジュール 表示例 備考
UNIXエポックに基づくタイムスタンプ float型 time 1612587698.479415 エポックタイムからの秒数
整数値または浮動小数点値
②特定の日時 datetime型 datetime 2021-02-06 14:02:23.592996 date(), time()メソッドの戻り値はdatetime型
他それぞれの属性は整数値
③datetime同士の時間差 timedelta型 datetime 0:00:03.003681 それぞれの属性は整数値
  • UNIXエポックタイムは、多くのプログラミング言語で使われる標準的な参照時間(1970/1/1 0:00 UTC協定世界時))のこと。
  • そのUNIXエポックタイムからの経過時間をエポックタイムスタンプと呼びます。
import time
import datetime

# ①UNIXエポックに基づくタイムスタンプ float型
epoch = time.time()
print(epoch)  # -> 1612587698.479415
print(type(epoch)) # -> <class 'float'>

# ②特定の日時 datetime型
dt = datetime.datetime.now()
print(dt)  # -> 2021-02-06 14:02:23.592996
print(type(dt))  # -> <class 'datetime.datetime'>

# ③datetime同士の時間差 timedelta型
td = datetime.timedelta(seconds=3)
print(td)  # -> 0:00:03.003681
print(type(td))  # -> <class 'datetime.timedelta'>

ちなみに、「②特定の日時」を表すデータ型には、他にも「date型」と「time型」というのがあります。ですが、基本的には日付と時刻がまとまっている「datetime型」を使えば問題ないのかなと思ってます。

datetime型を扱う

datetime型の使い方を整理しておきます。

datetimeオブジェクトの生成

特定の日時を表すdatetimeオブジェクトを扱うには、datetimeモジュールのdatetimeクラスを使います(まぎらわしい)。

現在日時を表すdatetimeオブジェクトを生成するには、datetime.now()を使います(datetimeモジュールのdatetimeクラスのnow()メソッドを呼び出す)。

指定した日時のdatetimeオブジェクトを生成するには、datetime()を使います(datetimeモジュールのdatetimeクラスのコンストラクタを呼び出す)。

from datetime import datetime

now = datetime.now()  # 現在日時
dt = datetime(2021, 1, 1, 10, 00, 00)  # 日時を指定(年、月、日、時間、分、秒)

生成したdatetimeオブジェクトは、以下のような属性にアクセスすることができます。

属性 意味
year
month
day
hour 時間
minute
second
microsecond ミリ秒
from datetime import datetime

dt = datetime(2021, 1, 1, 10, 00, 00)  # 日時を指定(年、月、日、時間、分、秒)
print(dt.year, dt.month, dt.day) # 2021 1 1

datetime→文字列に型変換

datetimeオブジェクトは、strftime()メソッドでフォーマットした文字列として表示させることができます。

メソッドの引数には、変換したい書式コード文字列(後述の表参照)を渡します。

ちなみにメソッド名の「str」は文字列、「f」はフォーマット(整形)の意味のようです。

from datetime import datetime

dt = datetime.now()
print(dt.strftime('%Y/%m/%d'))

よく使う書式コード一覧

書式 意味
%Y 西暦 4桁 '2021'
%y 西暦 2桁 '00'〜'99'
%m 月(0埋め) '01'〜'12'
%d '01'〜'31'
%w 曜日 '0'(日曜)〜'6'(土)
%H 時(24時間制) '00'〜'23'
%h 時(12時間制) '01'〜'12'
%M 分(0埋め) '00'〜'59'
%S 秒(0埋め) '01'〜'31'

こんな書式コードもあるよ

書式 意味
%B 月名 'January'
%b 月の略称 'Jan'
%A 曜日名 'Sunday'
%a 曜日の略称 'Sun'
%j 年初からの日数 '001'〜'366'
%p AMかPMか 'AM', 'PM'
%c 日時をまとめて表示 'Sun Feb 7 12:57:18 2021'
%x 日付をまとめて表示 '02/07/21'
%X 時間をまとめて表示 '12:57:18'
%% %文字

※書式コードの詳細については公式ドキュメント参照

docs.python.org

文字列→datetimeに型変換

今度は先ほどと逆に、日付情報の入った文字列を、datetime.strptime()メソッドでdatetimeオブジェクトに変換することができます。

メソッドの第1引数には変換したい文字列を、第2引数に対応する書式コード文字列を渡します。文字列が正確にマッチしないとValueError例外が発生するので、注意しましょう。

ちなみにメソッド名の「str」は文字列、「p」はパース(構文解析)の意味のようです。

from datetime import datetime

date = datetime.strptime('20200207', '%Y%m%d')

print(date)  # -> 2020-02-07 00:00:00
print(type(date))  # -> <class 'datetime.datetime'>

参考

docs.python.org

docs.python.org