LoginSignup
163
128

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-08

表題の通り。自分用メモ
環境は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の違いは何でしょうか?

163
128
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
163
128