こんにちは、monaghan_papaです。
今回はモジュールをひとつ取りあげてみたいと思います。
Python で日付や時間を扱う場合、標準モジュールに datetimeモジュール が備わっています。
日付や時間にはそれぞれデータ型が決められており、型ごとに日付や時間の生成、フォーマット文字列への変換処理、計算を効率的に行うことができます。
今回はこれらについて、基本を一気にまとめます。いわゆる datetimeモジュールまとめ記事 です!
日付や時間のデータ型一覧
データ型と担当する内容の一覧になります。以降で、各データ型について説明しますので、対応するクラスをすべてインポートしておきます。
データ型 | 担当内容 |
---|---|
datetime | 日付時刻 |
date | 日付 |
time | 時刻 |
timedelta | 日付、時刻の計算 |
# 必要なものをすべてインポート
from datetime import datetime, date, time, timedelta
日付を扱う datetime型
datetime型を生成する
以下の構文で、引数で指定した「年,月,日,時,分,秒,マイクロ秒」の datetime型 を生成します。
「年,月,日」は必須です。
dt = datetime(2022, 12, 31, 23, 59, 59, 999999)
dt
datetime.datetime(2022, 12, 31, 23, 59, 59, 999999)
なお、型には属性が存在します。
以下のように属性を指定することで属性値にアクセスすることができます。
# 上から年、月、日、時、分、秒、マイクロ秒
print(dt.year)
print(dt.month)
print(dt.day)
print(dt.hour)
print(dt.minute)
print(dt.microsecond)
2022
12
31
23
59
999999
文字列から datetime型へ変換する
以下の構文で、文字列を datetime型 にすることができます。
第1引数に日付文字列、第2引数にフォーマット文字列を指定します。
なお、フォーマット文字列の表記方法は以下の通りです。
表記 | 説明 |
---|---|
%Y | 西暦4桁 |
%m | 2桁ゼロ埋め月 |
%d | 2桁ゼロ埋め日 |
%H | 2桁ゼロ埋め時 |
%M | 2桁ゼロ埋め分 |
%S | 2桁ゼロ埋め秒 |
%f | 6桁ゼロ埋めマイクロ秒 |
dt = datetime.strptime('2022/12/31 23:59:59', '%Y/%m/%d %H:%M:%S')
dt
datetime.datetime(2022, 12, 31, 23, 59, 59)
datetime型から文字列に変換する
以下の構文で、datetime型 から 文字列 にすることができます。
引数にフォーマット文字列を指定します。
datetime型変数.strftime(‘フォーマット文字列’)
さきほど生成した datatime型の変数dt を変換してみます。
dt.strftime('%Y-%m-%d %H:%M:%S')
'2022-12-31 23:59:59'
現在日時を生成する
以下の構文で、現在日時が生成できます。
now = datetime.now()
now
datetime.datetime(2022, 2, 20, 15, 8, 51, 985436)
実際、生成したあとは 文字列型 に変換することが多いので、変換処理もしてみます。
now.strftime('%Y%m%d_%H%M%S')
'20220220_150851'
日付を扱う date型
date型を生成する
以下の構文で、引数で指定した date型を生成します。
引数はすべて必須です。
d = date(2022, 12, 31)
d
datetime.date(2022, 12, 31)
各属性にもアクセスしてみます。
print(d.year)
print(d.month)
print(d.day)
2022
12
31
文字列から data型へ変換する
文字列から date型へ変換する場合、残念ながら専用メソッドがありません。
そこで、段階を踏んで変換をかけます。
一旦、文字列を datetime型 にしたあと、それを date型 にする という方法です。
d = datetime.strptime('2022/12/31', '%Y/%m/%d').date()
d
datetime.date(2022, 12, 31)
datetime型から文字列へ変換する
以下の構文で、date型 から 文字列 にすることができます。
date型変数.strftime(‘フォーマット文字列’)
さきほで生成した date型 の 変数d を変換してみます。
d.strftime('%Y/%m/%d')
'2022/12/31'
現在日付を生成する
以下の構文で、現在日付が生成できます。
d = date.today()
d
datetime.date(2022, 2, 20)
実際、生成したあとは 文字列型 に変換することが多いので、変換処理もします。
d.strftime('%Y%m%d')
'20220220'
時間を扱う time型
time型を生成する
以下の構文で、引数で指定した time型 を生成します。
なお、引数はすべてオプショナルで且つ、デフォルト値は 0 になります。
t = time(23, 59, 59, 999999)
t
datetime.time(23, 59, 59, 999999)
各属性にもアクセスしてみます。
print(t.hour)
print(t.minute)
print(t.second)
print(t.microsecond)
23
59
59
999999
文字列からtime型へ変換する
文字列から time型 へ変換する場合、残念ながら専用メソッドがありません。
そこで、段階をふんで変換をかけます。
一旦、文字列を datetime型 にしたあと、それを time型 にする という方法です。
t = datetime.strptime('23:59:59', '%H:%M:%S').time()
t
datetime.time(23, 59, 59)
time型から文字列へ変換する
以下の構文で、time型 から文字列 にすることができます。
さきほど生成した time型 の 変数t を変換してみます。
t.strftime('%H:%M:%S')
'23:59:59'
日付、時間の計算を扱う timedelta型
以下の構文で、引数に指定した datetime型、date型 に対して計算ができる timedelta型を生成します。
なお、引数はすべてオプショナルで且つ、デフォルト値は 0 になります。
例として、2022年1月1日の365日後を求める というのをやってみます。
d = date(2022, 1, 1) # date型: 2022年1月1日
delta = timedelta(days=365) # timedelta型: 365日を指定
d + delta
datetime.date(2023, 1, 1)
うまくいっているようです!では、2020年1月1日の365日後を求める というのもやってみます。
ところで、2020年は閏年だったので、2月の最終日は28日ではなく、29日でした。どうなるか?!
d = date(2022, 1, 1) # date型: 2020年1月1日
delta = timedelta(days=365) # timedelta型: 365日を指定
d + delta
datetime.date(2023, 1, 1)
想定どおり、うまくいきました!!
以上で、datetimeモジュールまとめを終了いたします。
私自身は 本日日付時間をファイル名に含んだファイル出力 をする際、datetimeモジュールは一番使いどころが多いです。
ではまた。
コメント