[Python] 日付と時刻の表し方と演算(datetimeモジュール)

Python 時間制御

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()関数を用いる方法もあります。
以下の記事でもまとめているのでご参照ください。

【Python】 現在時刻を取得する(time.time)
time.time()はUNIXエポックを基準点とした経過秒数を返す関数で、現在時刻を取得するのに便利です。ただ、返り値の単位が「秒」、かつ浮動小数点型のため、何時何分なのかイマイチ分かり難いです。そこで、datetimeモジュールを使って見やすく変換する方法についても紹介します。また、この関数は、あるコードブロックの処理時間を計測するのに使われることもありますが、使う際には少し注意が必要です。そのあたりも併せてまとめてみました。

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]
%pAM/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モジュールを使った、日付・時刻の表し方や演算機能、および時刻〜文字列の変換方法についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project