Pythonで日付の計算を行う

この記事の内容
  • Pythonで日付を扱う方法
  • Pythonのdatetimeについて

この記事の対象者
  • Pythonエンジニア
  • Pythonの学習者

この記事の構成
  1. datetimeでできること
  2. datetime.timedeltaで時間の計算

はじめに

Djangoなど、Pythonを使って開発をしていると時間や日付を扱うことがとても多くなります。

特に、データを扱うと、時間を操作するスキルは必須になってきます。時間同士を計算したいケースは開発やデータ計算をしているとかなりでてきます。

今回は、Pythonの便利な標準ライブラリ datetime についてさらっていきたいと思います。

datetimeでできること

まずは、Pythonの公式ドキュメント: datetimeを参考に、datetimeライブラリの基本部分についてみていきましょう。

datetime.datetime

datetime.datetimeには、日時のデータが入ります。
つまり、年、月、日、時、分、秒、ミクロ秒ですね。

datetime.time

datetime.timeには、時間のデータが日付とは独立して入ります。時、分、秒、ミクロ秒ですね。

datetime.date

datetime.dateには、日付のデータが入ります。年、月、日ですね。

そして、Pythonで日付や時間の計算を行う時、もっとも簡単な方法が、datetimeのtimedeltaを使用するやり方です。

公式ドキュメント曰く、datetime.timedeltaとは、

"date, time, あるいは datetime クラスの二つのインスタンス間の時間差をマイクロ秒精度で表す経過時間値です"

これだと少し難しいので、簡単に言うと、timedeltaを使うと、2日分の時間データとか、4週間分の時間データという風に、まとまった時間をdatetime型(Pythonの日付型)にしてくれます。

"Pythonで4週間分の時間を用意してくれ"

って言われても、どうすればいいんだ。。。ってなりますよね笑 純粋に4週間分のマイクロセカンドを数字にして、datetime型に丸めるっていうやり方もできそうですが、
秒ならまだしもマイクロセカンドならかなりしんどいです。

timedeltaを使うと、一定の時間を、一つにまとめることができます。

import datetime
print(datetime.timedelta(days=3))
# 出力結果
3 days, 0:00:00

また、公式ドキュメントにある通り、datetimeはPythonの中でクラス関数になっています。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

引数に指定されている値を見る限り、週からマイクロセカンドまではtimedeltaでひとまとめにできそうですね。

あとは、現在時刻とか、今日の日付とかから足したり、引いたりすれば簡単に目的の時間を割り出すことができます。
現在時刻や今日の日付は以下で簡単に取得できます。

現在時刻
datetime.datetime.now()

今日の日付
datetime.date.today()

datetime.timedeltaで時間の計算

では、実際にdatetimeを使って、時間の計算をしていきましょう。

下記にいくつかのケースを用意しました。

  • 昨日の日付を取得したい
  • 1週間後の日付を取得したい
  • 12時間前の日時を取得したい
  • 10秒後の日時を取得したい

全て、現在時刻や今日の日付から引き算や足し算で割り出せそうです。

昨日の日付を取得したい

import datetime
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
print(yesterday)
# 出力結果
2020-05-08

1週間後の日付を取得したい

import datetime
today = datetime.date.today()
in_one_week = today + datetime.timedelta(weeks=1)
print(in_one_week)
# 出力結果
2020-05-16

12時間前の日時を取得したい

import datetime
now = datetime.datetime.now()
harf_day_ago = now - datetime.timedelta(hours=12)
print(harf_day_ago)
# 出力結果
2020-05-08 13:41:26.314286

10秒後の日時を取得したい

import datetime
now = datetime.datetime.now()
ten_seconds_later = now + datetime.timedelta(seconds=10)
print(ten_seconds_later)
# 出力結果
2020-05-09 01:42:29.249619

上記のように、たった数行で、少し抵抗のある時間データを扱うことができます。

また余談ですが、これらのデータは、datetime型やdate型になっているので、例えば、HTML上で綺麗に表示したいときはstrftime()を使用すれば簡単に表記できます。

例えば、1つ目のケースの

2020-05-08

の場合、

print(yesterday.strftime('%Y年%M月%d日'))
# 出力結果
2020年05月08日

綺麗に日本語の形で表示することができました。

%などの時間フォーマットについては以下の公式ドキュメント参照です。
Python:時刻フォーマット

終わりに

今回は、Pythonの標準ライブラリdatetimeの基本的な部分について、説明しました。

Djangoなどで開発しているとき、1日前以降に作成されたデータや、特定の日付から1週間のデータなど、特にDBへのクエリを操作するときにdatetimeは多用しています。

Pythonは処理が遅いと言われている言語ですが、標準ライブラリの多くは非常に高速なCやC++で動いています。

これらのライブラリを駆使して、コードもすっきりと簡潔に、かつ処理も最適なプログラミングをPythonでできれば最高ですね⭐︎