Python
timedelta
datetime
dateutil
relativedelta

Pythonで翌日や翌月みたいな日付の計算をする

表題の通り。自分用メモ
環境はPython3系。

日にち単位の演算(翌日とか)

  • 今日の日付取得
  • 明日、昨日の計算

必要なモジュールのインポート

from datetime import datetime, date, timedelta

基本これくらいあればいい

今日の日付を取得する

today = datetime.today()
print(datetime.strftime(today, '%Y-%m-%d'))

# 結果
# 2017-12-08

(補足)

  • datetime.strftime(変数, フォーマット):日付型→文字列への変換
  • datetime.strptime(変数, フォーマット):文字列→日付型への変換

明日、昨日を計算する

tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)

print("tomorrow -> " + datetime.strftime(tomorrow, '%Y-%m-%d'))
print("yesterday -> " + datetime.strftime(yesterday, '%Y-%m-%d'))

# 結果
# tomorrow -> 2017-12-09
# yesterday -> 2017-12-07

(補足)

  • timedeltaオブジェクトは二つの日付や時刻間の差を表す
    • timedelta(days=1)というオブジェクトは1日分の差を表す
    • 他にはseconds, minutes, hoursみたいな引数が使える

月単位の演算(翌月とか)

datetimeでは計算できないのでdateutilライブラリのrelativedeltaモジュールを使用する。
上記に加えてyear, month, weekとかも使えるのでこれ使えば上記の計算も全部賄えるっぽい。

必要なモジュールのインポート

from dateutil.relativedelta import relativedelta

1ヶ月後、1ヶ月前を計算する

one_month_after = today + relativedelta(months=1)
one_month_ago = today - relativedelta(months=1)

print("one_month_after -> " + datetime.strftime(one_month_after, '%Y-%m-%d'))
print("one_month_ago -> " + datetime.strftime(one_month_ago, '%Y-%m-%d'))

# 結果
# one_month_after -> 2018-01-08
# one_month_ago -> 2017-11-08

応用

ココらへんを応用すれば"初日や末日"みたいなのも計算できる。

「今月の1日」を出す

first_day = today.replace(day=1)
print(datetime.strftime(first_day, '%Y-%m-%d'))

# 結果
# 2017-12-01

「今月の末日」を出す

last_day = (today + relativedelta(months=1)).replace(day=1) - timedelta(days=1)
print(datetime.strftime(last_day, '%Y-%m-%d'))

# 結果
# 2017-12-31

(補足)

  • datetimeオブジェクトのreplace()メソッドにday=◯を指定することでその値を置き換えられる
  • calenderパッケージを使えばもっと楽にできる(特に末日…)

参考文献

[Python] 1ヶ月後や1年後や月初や月末を簡単に求める(python-dateutil)
Python で前月同日・前月末日を求める
strftimeとstrptimeの違いは何でしょうか?