124
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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の違いは何でしょうか?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
124
Help us understand the problem. What are the problem?