Pythonで日時や時刻を見やすく表示したり、日付計算をするにはdatetimeモジュールを使います。本記事ではこのモジュールを使った日付や時刻の表し方についてまとめます。
確認した環境
- OS:Ubuntu16.04LTS
- Python 3.7.0
現在の日付と時刻を取得する
現在の日付と時刻を取得する場合は、datetime.now()メソッドを用います。
>>> import datetime
# 現在の日付と時刻を取得
>>> datetime.datetime.now()
datetime.datetime(2018, 11, 4, 21, 26, 9, 847287)
戻り値はdatetimeオブジェクトで、年、月、日、時、分、秒、マイクロ秒などの値が属性として含まれています。
現在日時・時刻を取得するには、time.time()関数を用いる方法もあります。
以下の記事でもまとめているのでご参照ください。
datetimeオブジェクトの生成
日付や時刻データから、datetimeオブジェクトを生成することも可能です。
以下のように、年、月、日、時、分、秒の値を引数に指定します。
# 2014/11/8 16:30を指定する場合
>>> import datetime
>>> dt = datetime.datetime(2014, 11, 8, 16, 30, 00)
また、日付や時刻の値は、datetimeオブジェクトの属性を参照することで確認できます。
# それぞれの属性を確認
>>> dt.year, dt.month, dt.day
(2014, 11, 8)
>>> dt.hour, dt.minute, dt.second
(16, 30, 0)
時刻の演算
datetimeオブジェクトは、比較演算子を用いて時刻を比較したり、加算・減算等のによる日付計算もできます。
時刻の比較
datetime1 が datetime2 よりも前の場合、datetime1 < datetime2となります。
例えば、
# 2018/11/20 18:30:00
>>> dt1 = datetime.datetime(2018, 11, 20, 18, 30, 00)
# 2014/11/8 16:30:00
>>> dt2 = datetime.datetime(2014, 11, 8, 16, 30, 00)
# 時刻の比較
>>> dt1 < dt2
False
>>> dt1 > dt2
True
>>> dt1 != dt2
True
>>> dt3 = datetime.datetime(2018, 11, 20, 18, 30, 00)
>>> dt1 == dt3
期間を表す
datetimeモジュールには、期間(経過時間、すなわち二つの日付や時刻間の差)を表すtimedelta型のデータ型もあります。
期間を表す引数(weeks, days, hours, minutes, seconds, milliseconds, microseconds)をtimedelta()メソッドに渡すことで、timedelta オブジェクトが生成されます。
このオブジェクトから参照できる属性は、days, seconds, microseconds だけです。年や時間は参照できないので注意が必要です。
>>> delta = datetime.timedelta(days=20, hours=3, minutes=15, seconds=8)
>>> delta.days, delta.seconds
(20, 11708)
また、トータル秒数はtotal_second()メソッドで取得できます。
>>> delta.total_seconds()
1739708.0
文字列に変換してもっと見やすい表記にすることもできます。
>>> str(delta)
'20 days, 3:15:08'
日付・時刻の演算
ある日時(datetimeオブジェクト)からある期間(timedeltaオブジェクト)経過後の日時は、加算(datetime1 + timedelta1)により求められます。
例えば、現在から200日後を計算するには以下のようにします。
# 現在時刻の取得
>>> date = datetime.datetime.now()
>>> date
datetime.datetime(2018, 11, 4, 22, 45, 54, 395538)
# 現在時刻に、200日のtimedeltaオブジェクトを加算
>>> date + datetime.timedelta(days=200)
datetime.datetime(2019, 5, 23, 22, 45, 54, 395538)
また、過去のある時点から現在までの経過時間を計算するには、2つのdatetimeオブジェクトの差を計算します。
>>> import datetime
# 現在時刻
>>> dt0 = datetime.datetime.now()
# 過去のある時点(例:2014/11/8 16:30:00)
>>> dt1 = datetime.datetime(2014, 11, 8, 16, 30)
# 経過時間(差)を計算
>>> delta = dt0 - dt1
>>> delta
datetime.timedelta(days=1457, seconds=22717, microseconds=511045)
時刻を文字列で表す
strftime()メソッドを用いると、datetimeオブジェクトの返り値を任意の書式で表すことができます。
このメソッドに設定する書式のうち、よく使いそうなものを下表に示します。
書式 | 内容 |
---|---|
%Y | 西暦 (4桁) [1, 9999] |
%m | 月 [01, 12] |
%b | 月(現在地に合わせた月名) [ Jan, Dec] (en_US) |
%d | 日にち[01, 31] |
%H | 時間(24時間表記) [00, 23] |
%I | 時間(12時間表記) [01, 12] |
%M | 分 [00, 59] |
%S | 秒 [00, 59] |
%p | AM/PM (現在地に合わせた表記) |
実際はもっとたくさんあります。詳細は公式リファレンスを参照ください。
以下に実際の例を示します。
>>> dt0.strftime('%Y/%m/%d %H:%M:%S')
'2018/11/04 18:15:42'
>>> dt0.strftime('%b %d, %Y %I:%M:%S%p')
'Nov 04, 2018 06:15:42PM'
文字列を時刻に変換する
日付・時刻を表す文字列をdatetimeオブジェクトに変換するには、strptime()メソッドを用います。
第一引数に日付・時刻を表す文字列、第二引数に、対応するフォーマットを設定します。
以下の例を参照ください。
>>> datetime.datetime.strptime('2018/11/8 16:30', '%Y/%m/%d %H:%M')
datetime.datetime(2018, 11, 8, 16, 30)
第二引数に設定するフォーマットが第一引数の日付・時刻フォーマットに合わない場合は、ValueErrorを送出します。
まとめ
datetimeモジュールを使った、日付・時刻の表し方や演算機能、および時刻〜文字列の変換方法についてまとめました。