Pythonにおける日付型(Date)を理解する
多くのプログラミング言語には日付を扱うためのdateクラスが用意されています。Pythonでもそれは同様です。
しかし、その扱い方にはdatetimeモジュールを利用することなど、他とは少々異なる方法が用いられます。
今回は、Pythonにおける日付型を実際のコードと共に解説していきます。
日付型(date)とは
単なる数値や文字列とは異なり、日付の管理は少し難しく、考慮すべき事項が多く存在します。
うるう年や、ひと月ごとの日数、曜日などの管理は、単なる数字や計算式のみを用いて自分で正確に算出しようとすると、多くの工数がかかってしまうものです。
この日付という概念をプログラミング上で簡単かつ正確に扱えるよう用意されているのが、dateクラスです。
プログラミング言語全般におけるdate型
日付を扱うためのdateクラスは大半のプログラミング言語に用意されています。
日付という概念はプログラムを書いているとかなり高い頻度で考慮する機会があるため、それを扱うためのdateクラスはどういったプログラミング言語であっても、欠かせない存在なのです。
そのため、dateクラスを使いこなすことは活躍できるITエンジニアになるために必須とも言えます。
Pythonにおける日付型(datetime, date, time)
さて、ここまで日付型のことをdateクラスと称してきましたが、Pythonにおいてはこの表現は正確ではありません。
Pythonでは、日付に関わるクラスやメソッドはdatetimeモジュールとして提供されています。
このdatetimeモジュールをインポートすることで、datetimeクラスをPythonで扱えます。datetimeクラスはdateクラスとTimeクラスのふたつを足し合わせたクラスであり、これらはそれぞれ日本語では日付型と時間型と称されています。
(ややこしい話ですが、多くのプログラミング言語で一般的に表現される日付型(date)とは、Pythonにおける日付型(date)と時間型(Time)を足し合わせたdatetime型と同義です。)
Pythonで現在の日時を求める方法
Pythonにおける日付や時間を扱うクラスdatetimeクラスはdatetimeモジュールとして提供されています。このdatetimeモジュールは次のコードでインポートすることができます。
datetimeモジュールはPythonの標準モジュールです。
import datetime
import + モジュール名で、指定したモジュールをインポートすることができます。
また、次のコードで指定したモジュールの、指定したクラスを取得することが可能です
from datetime import datetime
importのみのコードがモジュールを指定するだけであるのに対し、from ~ import ~ 文では、モジュール内のどのクラスをインポートするかということまで指定できるのです。
構文としてはfrom + モジュール名 import + クラス名となります。
import detetimeで利用可能となったdatetimeモジュールを用いて現在の日付や時間を取得するためのコードを以下で解説していきます。
ですのでfrom datetime import datetimeが示すのはdatetimeモジュールのdatetimeクラスをインポートする、という意味です。
datetime.now()でdatetimeオブジェクトを作成する
datetimeオブジェクトの作成は、以下のように行います。
from datetime import datetime
datetime.now() # now()によりdatetimeオブジェクトが作成される
上記コードのnow()メソッドによって、datetimeオブジェクトを作成されています。ここで作成されるdatetimeオブジェクトは現在のローカルな日付・時間を示すものとなっています。
また、メソッドの細かな挙動は異なりますが、同様にdatetimeオブジェクトを作成するメソッドとしてtoday()メソッドというメソッドも用意されています。today()メソッドもnow()メソッドと同様に、datetimeクラスが保持するメソッドです。
datetime.date() でdateオブジェクトを作成する
datetimeオブジェクトは日付型(date)と時間型(time)が足しあわされたものです。datetimeオブジェクトからこのうちの日付型(date)のクラスのみを作成したい場合のメソッドが、datetimeクラスには用意されています。
from datetime import datetime
datetime.now().date() # date()によりdateオブジェクトが作成される
date()メソッドを用いれば、このように、datetimeオブジェクトからdateオブジェクトを作成することが可能です。dateオブジェクトは日付のみを管理するクラスのインスタンスであるため、時間に関わる情報については管理しないようになっています。
date.today()で今日の日付を取得する
datetime.now()の解説の最後で登場したdatetimeクラスのメソッドtoday()ですが、datetimeクラスではなくdateクラスにも同様のメソッドが用意されています。
from datetime import datetime, date
date.today() # yyyy-MM-dd形式の値を取得
datetime.today() # yyyy-MM-dd hh:mm:ss.ssssss形式の値を取得
これらは同名のメソッドではありますが、メソッドが返却する値については少々違いがあります。
dateクラスのtoday()メソッドはyyyy-MM-dd形式で日付を取得するのみですが、datetimeクラスのtoday()メソッドはyyyy-MM-dd hh:mm:ss.ssssss形式で日付 + 時間を取得します。状況に応じて使い分けることが大切と言えるでしょう。
Pythonにおけるdatetimeの便利な使い方
その他にも、日時を扱うために便利なメソッドが用意されています。
現在の日時の取得
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
print(f"現在の日時: {now}")
改めて基本の現在日時取得です。Pythonのdatetimeモジュールからnow関数を使用して現在の日時を取得します。
取得した日時はdatetimeオブジェクトとして返され、これをprint関数で出力します。
特定の日時の作成
from datetime import datetime
# 特定の日時を作成
dt = datetime(2024, 3, 14, 19, 49)
print(f"特定の日時: {dt}")
このコードは、datetimeクラスのコンストラクタを使用して特定の日時を作成します。
コンストラクタには年、月、日、時、分を順に指定します。
日付指定はソフトウェア開発や集計などでよく発生します。
日時のフォーマット
from datetime import datetime
# 現在の日時を取得
now = datetime.now()
# 日時を文字列に変換
formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"フォーマットされた日時: {formatted_now}")
このコードは、strftimeメソッドを使用してdatetimeオブジェクトを文字列に変換します。
strftimeメソッドには、日時のフォーマットを指定する文字列を渡します。
指定のフォーマットで日時を出力する機会もとても多いので覚えておきましょう。
日時の差分の計算
from datetime import datetime, timedelta
# 現在の日時を取得
now = datetime.now()
# 5日後の日時を計算
future = now + timedelta(days=5)
print(f"5日後の日時: {future}")
# 現在と未来の日時の差分を計算
diff = future - now
print(f"日時の差分: {diff}")
このコードは、timedeltaクラスを使用して日時の差分を計算します。
timedeltaクラスのインスタンスは、日、時間、分、秒などの時間の長さを表します。
これをdatetimeオブジェクトに加えることで、未来の日時を計算します。また、2つのdatetimeオブジェクトの差を取ることで、それらの日時の差分を計算します。
まとめ
日時の操作や出力は、ソフトウェア開発で考慮する機会がとても多くあります。
Pythonにおける日付型datetimeクラスを利用すれば、日付に関わる操作を簡単に行うことができます。また、datetimeクラスからdateクラスを取得することで、取得する情報を日付 + 時間から日付のみに絞ることも可能となります。
状況に応じたクラスの使い分けを行いながら、日付に関わる適切なコーディングを行いましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。