Python

【Python】標準ライブラリの活用(日時:datetime)

標準ライブラリの活用(日時:datetime) Python

前回の記事でPythonの標準ライブラリの中から汎用性の高いものとして算術計算(math、random、statistics)モジュールについて、その利用方法について説明しました。

今回も、Pythonの標準ライブラリの中から汎用性の高いものについてピックアップして学んでいきたいと思います。

今回は日時に関するモジュールから紹介します。

この記事を読んで分かること
  • Pythonの標準ライブラリの使い方がわかる
  • 日時(datatime)のモジュールについての使い方が分かる
スポンサーリンク

日時とdatetimeモジュール

Pythonで日時のライブラリは「datetime」というモジュールを使います。

まずは、その使い方から見ていきましょう。

from datetime import *

このモジュール内には日時に関するいくつかのクラスが用意されています。

日時を扱う上で最も基本となるのが以下の3クラスです。

クラス役割
datetime日時を扱うためのクラス
年月日時分秒の全ての時間に関する情報を管理する
date日付を扱うためのクラス
年月日の情報を管理するが、時刻などの情報は持たない
time時間を扱うためのクラス
時分秒の情報を管理するが、日付などの情報は持たない

これらは、必ずしも単独で使うというわけではなく、連携して扱うこともあります。

例えば、datetimeインスタンスで日時の値を作成し、そこから日付のdateインスタンスと、時刻のtimeインスタンスを取り出すことも可能です。

日時を表すクラスは「datetime」「date」「time」の3つがある

スポンサーリンク

datetimeクラス

日時の値の最も基本となるのが「datetime」クラスです。
日時全般の値を扱うのに利用されます。

日付を扱うdateクラスと時刻を扱うtimeクラスの両方の情報をひとまとめにして持っているので、このクラス1つで日付と時刻を同時に扱えます

now/todayメソッド

現在の日時を表すdatetimeインスタンスを作成するために、「now」または「today」メソッドを使います。

これは引数なしのクラスメソッドで以下のように利用します。

datetime.now()
datetime.today()

「now」メソッドと「today」メソッドの違いは、nowメソッドの方はキーワード引数の「tz=」でタイムゾーンを指定できます。

ただし省略もできますので、タイムゾーンを指定しないのであればメソッドとしての振る舞いはどちらも変わりません

では上記メソッドを使って現在の日時を表示してみましょう。

from datetime import *

dt = datetime.now()
print(dt)
dt = datetime.today()
print(dt)

実行結果は以下です。

2022-04-07 13:43:05.451017
2022-04-07 13:43:05.451082

年月日時分秒の値が全て表示されています。
また秒に関してもマイクロ秒(百万分の1秒)まで表示されていることが分かります。

日時を指定する

現在の日時ではなく、特定の日時を表すインスタンスを作成します。

その場合はdatetimeコンストラクタを使い、引数に年月日時分秒の値を指定するとその日時のインスタンスを作成できます。

datetime(年, 月, 日, 時, 分, 秒, マイクロ秒)

引数は全てint型で指定しますが、全て指定する必要はありません
日付だけ必要なら年月日の値だけで構いません。

また時刻は、時、分、秒、マイクロ秒の左側から必要な値だけ記述すればインスタンスを作成できます。

ではこちらも実行してみましょう。

from datetime import *

dt = datetime(2022,1,29,15,42,30)
print(dt)

dt = datetime(2222,2,12,21)
print(dt)

実行結果は以下となります。

2022-01-29 15:42:30
2222-02-12 21:00:00

2つめのインスタンスは時間以降は指定しなかったため、分と秒は「00」が指定されています。

日時の要素を得る

datetimeには、年月日時分秒の各要素の値を示すプロパティが用意されていて、そのプロパティを利用して特定の値を取り出せます

プロパティ値は以下です。
いずれも整数値で設定されており、全て読み取り専用であるため値を書き換えることは出来ません

プロパティ内容
year年の値、西暦の年を表す
month月の値、1〜12の値を取る
day日の値、1〜31の範囲(月によって終わりは変化)を取る
hour時の値、0〜23の値を取る
minute分の値、0〜59の値を取る
second秒の値、0〜59の値を取る
microsecondマイクロ秒の値、0〜999999の値を取る

では実際に見てみましょう。
ここでは、年月日時分秒の値をそれぞれ取り出して表示しています。

from datetime import *

dt = datetime.now()
res1 = str(dt.year)+"年"+str(dt.month)+"月"+str(dt.day)+"日"
res2 = str(dt.hour)+"時"+str(dt.minute)+"分"+str(dt.second)+"秒"

print(res1)
print(res2)

実行結果は以下です。

2022年4月7日
14時3分47秒

各プロパティ単位に年月日時分秒の値を取得できることが分かりました。

日時の値は、datetimeクラスの「year」「month」「day」「hour」「minute」「second」「microsecond」で個々に値を取り出せる

スポンサーリンク

dateクラス

先ほどのdatetimeクラスに対して、日付を扱うのがdateクラスです。

インスタンスを取得するメソッド

dateインスタンスを取得するメソッドは以下の3つです。

date.today()

date(年, 月,

datetimeインスタンス.date()

これらを使ってdateインスタンスを取得します。

日付の要素を得る

dateにも、年月日の各要素の値を得るためのプロパティがあります。
プロパティに関してはdatetimeに用意されているものと同じです。

プロパティ内容
year年の値、西暦の年を表す
month月の値、1〜12の値を取る
day日の値、1〜31の範囲(月によって終わりは変化)を取る

ではdataクラスを作成して実際に表示してみましょう。

from datetime import *

dt = date.today()
res = str(dt.year)+"年"+str(dt.month)+"月"+str(dt.day)+"日"
print(res)

dt = date(2022,4,12)
res = str(dt.year)+"年"+str(dt.month)+"月"+str(dt.day)+"日"
print(res)

dt = datetime.today().date()
res = str(dt.year)+"年"+str(dt.month)+"月"+str(dt.day)+"日"
print(res)

実行結果は以下です。

2022年4月7日
2022年4月12日
2022年4月7日
スポンサーリンク

timeクラス

先ほどのdateクラスに対して、時刻を扱うのがtimeクラスです。

インスタンスを取得するメソッド

timeインスタンスを取得するメソッドは以下の3つです。

time(時, 分, , マイクロ秒

datetimeインスタンス.time()

これらを使ってdateインスタンスを取得します。

timeクラスには、datetimeやdateにあった「現在の時刻を得る」というメソッドはありません
なので現在時刻はdatetimeのtodayメソッドからインスタンスを取得し、時刻を取得します。

時刻の要素を得る

timeにも、年月日の各要素の値を得るためのプロパティがあります。
プロパティに関してはdatetimeに用意されているものと同じです。

プロパティ内容
hour時の値、0〜23の値を取る
minute分の値、0〜59の値を取る
second秒の値、0〜59の値を取る
microsecondマイクロ秒の値、0〜999999の値を取る

ではtimeクラスを作成して実際に表示してみましょう。

from datetime import *

dt = time(15,11,32)
res = str(dt.hour)+"時"+str(dt.minute)+"分"+str(dt.second)+"秒"
print(res)

dt = datetime.today().time()
res = str(dt.hour)+"時"+str(dt.minute)+"分"+str(dt.second)+"秒"+str(dt.microsecond)+"マイクロ秒"
print(res)

実行結果は以下です。

15時11分32秒
14時54分57秒587308マイクロ秒
スポンサーリンク

timedeltaクラス

timedeltaクラスは、時間の間隔を表すためのクラスです。
これはインスタンスを作成して利用することも可能ですし、日時の演算結果の値として返されることもあります。

コンストラクタでインスタンスを作成する場合は、日時の単位となるキーワード引数を指定します。

timedelta(weeks=0, days=0, hours=0, minutes=0, seconds=0, microseconds=0

このtimedeltaクラスには、日時の各要素の値を示すプロパティ値が用意されており、そこから値を取り出せます。

プロパティ内容
days日数を表すプロパティ
seconds秒数を表すプロパティ
microsecondsマイクロ秒数を表すプロパティ

基本的に、日付の演算ではdaysによる日数、時刻の演算ではsecondsによる秒数を使って日時の間隔を得ます。

では実際に日時を使った演算をしてみましょう。

日時の減算

日時関係のクラスは減算することができます。

これにより、2つの日時の差(どれだけの時間が経過しているか)を調べられます。

(datetime/date/timeインスタンス)ー(datetime/date/timeインスタンス)

このように引き算すると、その2つの日時の間隔を計算して返します。
返す値はtimedeltaクラスのインスタンスとなります。

では実際に試してみましょう。

今日は2010年1月1日から何日経過しているでしょうか。

from datetime import *

dt1 = date.today()
dt2 = date(2010,1,1)

res = dt1 - dt2
msg = "2010年1月1日から"+str(res.days)+"日経過"
print(msg)

dateクラスのインスタンスを減算してその差分を表示しています。

res変数には「timedelta」インスタンスが格納されていますので、日数を表す「days」変数で経過日を取得しています。

実行結果は以下となります。

2010年1月1日から4479日経過

日時のインスタンスは、減算で経過した日時を計算できる

日時の加算

先ほどとは逆に日時の加算もできます。

(datetime/date/timeインスタンス)+(timedeltaインスタンス)

日時関係のクラスのインスタンスにtimedeltaクラスのインスタンスを使って日時の間隔を作成し、それを加算すれば、指定した時間だけ経過した日時を得ることができます。

ではこれも実際に試してみましょう。

今日から1000日後を調べてみましょう。

from datetime import *

dt1 = date.today()
dt2 = dt1+timedelta(days=1000)

msg = "今日から1000日後は"+str(dt2)
print(msg)

dateクラスのインスタンスにtimedeltaインスタンスを1000日で作成して加算しています。

実行結果は以下となります。

今日から1000日後は2025-01-01

日付の足し算は、timedeltaで加算する時間を用意して日時に加える

スポンサーリンク

まとめ

今回は、Pythonでの標準ライブラリである日時(datetimeモジュール)の利用方法について学びました。