前回の記事でPythonの標準ライブラリの中から汎用性の高いものとして算術計算(math、random、statistics)モジュールについて、その利用方法について説明しました。
今回も、Pythonの標準ライブラリの中から汎用性の高いものについてピックアップして学んでいきたいと思います。
今回は日時に関するモジュールから紹介します。
- Pythonの標準ライブラリの使い方がわかる
- 日時(datatime)のモジュールについての使い方が分かる
日時とdatetimeモジュール
Pythonで日時のライブラリは「datetime」というモジュールを使います。
まずは、その使い方から見ていきましょう。
このモジュール内には日時に関するいくつかのクラスが用意されています。
日時を扱う上で最も基本となるのが以下の3クラスです。
クラス | 役割 |
---|---|
datetime | 日時を扱うためのクラス 年月日時分秒の全ての時間に関する情報を管理する |
date | 日付を扱うためのクラス 年月日の情報を管理するが、時刻などの情報は持たない |
time | 時間を扱うためのクラス 時分秒の情報を管理するが、日付などの情報は持たない |
これらは、必ずしも単独で使うというわけではなく、連携して扱うこともあります。
例えば、datetimeインスタンスで日時の値を作成し、そこから日付のdateインスタンスと、時刻のtimeインスタンスを取り出すことも可能です。
datetimeクラス
日時の値の最も基本となるのが「datetime」クラスです。
日時全般の値を扱うのに利用されます。
日付を扱うdateクラスと時刻を扱うtimeクラスの両方の情報をひとまとめにして持っているので、このクラス1つで日付と時刻を同時に扱えます。
now/todayメソッド
現在の日時を表すdatetimeインスタンスを作成するために、「now」または「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コンストラクタを使い、引数に年月日時分秒の値を指定するとその日時のインスタンスを作成できます。
引数は全て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秒
各プロパティ単位に年月日時分秒の値を取得できることが分かりました。
dateクラス
先ほどのdatetimeクラスに対して、日付を扱うのがdateクラスです。
インスタンスを取得するメソッド
dateインスタンスを取得するメソッドは以下の3つです。
これらを使って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つです。
これらを使って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クラスには、日時の各要素の値を示すプロパティ値が用意されており、そこから値を取り出せます。
プロパティ | 内容 |
---|---|
days | 日数を表すプロパティ |
seconds | 秒数を表すプロパティ |
microseconds | マイクロ秒数を表すプロパティ |
基本的に、日付の演算ではdaysによる日数、時刻の演算ではsecondsによる秒数を使って日時の間隔を得ます。
では実際に日時を使った演算をしてみましょう。
日時の減算
日時関係のクラスは減算することができます。
これにより、2つの日時の差(どれだけの時間が経過しているか)を調べられます。
このように引き算すると、その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日経過
日時の加算
先ほどとは逆に日時の加算もできます。
日時関係のクラスのインスタンスに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
まとめ
今回は、Pythonでの標準ライブラリである日時(datetimeモジュール)の利用方法について学びました。