「Pythonで今日の日付を取得したい」
「Pythonで日時取得したいけど時間までは要らない」
「なぜか日付の計算でエラーになる時がある」
本日はそんな方に向けてPythonで日付取得と日付計算する方法を解説していきます。
日付や時間の取得、フォーマット変換、日付間の計算など、Pythonで日付を扱う方法はさまざまです。
本記事ではdatetimeモジュールを使った現在の日付取得方法(now)、文字列を日付型に変換する方法(strptime)、日付を文字列に変換する方法(strftime)、カレンダー情報の取得(calendarモジュール)、うるう年の判定(isleapメソッド)、今日の日付を取得する方法(todayメソッド)、日付を表すdateオブジェクトの作成、日付の差分を扱う方法(timedeltaクラス)など、様々な操作方法を実例を交えて詳しく解説します。
またdatetime型とdate型の違いについても比較しながら説明し、それぞれの特性や適切な使い方について理解を深めていきます。
Pythonを使った日付操作は、プログラミングにおいて非常に重要です。
日付処理に関する基本的なスキルを身につけ、さらに高度な日付操作にも挑戦できるようになるでしょう。
また動画もあるので必要に応じて活用してください。
Pythonのdatetime型を使って日付、時間を取得する方法
Pythonではdatetime型というデータの種類によって日程や時間に関するデータを扱うことができます。
また標準で搭載されているdatetimeモジュールというものをインポートすることで簡単な文法で表現できます。
from datetime import datetime
new_date = datetime(2024,2,4,12,0,0)
print(new_date) # 2024-02-04 12:00:00と表示される
datetimeモジュールにあるdatetimeメソッドというものはdatetime型のデータを作り出すメソッドです。
引数に年、月、日、時、分、秒を数字で指定します。
作成されたdatetime型の変数にはドットでつなげて部分だけ取り出すことも可能です。
from datetime import datetime
new_date = datetime(2024,2,4,12,0,0)
# ここを追加
print(new_date.year) # 2024と表示される
print(new_date.month) # 2と表示される
print(new_date.day) # 15と表示される
print(new_date.hour) # 12と表示される
print(new_date.minute) # 0と表示される
print(new_date.second) # 0と表示される
さらに本日の日時を取得するにはdatetime.nowメソッドを実行すれば取得できます。
from datetime import datetime
new_date = datetime(2024,2,4,12,0,0)
print(new_date.year) # 2024と表示される
print(new_date.month) # 2と表示される
print(new_date.day) # 15と表示される
print(new_date.hour) # 12と表示される
print(new_date.minute) # 0と表示される
print(new_date.second) # 0と表示される
# ここを追加
print(datetime.now()) # 本日の日付と時間と表示される
「文字列でそのまま日時を書いたらダメなの?」と思われた方がいるかもしれません。
文字列で書いても表示は変わりませんが、動的に変化させたり日時の計算ができなくなってしまいます。
そのため文字列で書かれた日時表記は以下のようにdatetime型に変換する必要があります。
from datetime import datetime
# 文字列→datetime型(mの大文字、小文字は注意)
str_date = datetime.strptime("2024/2/4 12:00:00", "%Y/%m/%d %H:%M:%S")
print(str_date) # 2024-02-04 12:00:00と表示される
print(type(str_date)) # class=datetime.datetimeと表示される
一方でdatetime型を文字列に戻す場合は以下のように書きます。
from datetime import datetime
# datetime型→文字列(strptime, strftimeの違いに注意)
date_str = str_date.strftime("%Y-%m-%d %H:%M:%S")
print(date_str) # 2024-02-04 12:00:00と表示される
print(type(date_str)) # class=strと表示される
ユーザーからの見た目は一緒に見えるのですが、上記のようにデータの種類は変わっていることをtypeメソッドで確認すると良いでしょう。
Pythonのcalendarモジュールでうるう年を判定する
datetimeモジュールにあわせてcalendarメソッドを使うと「うるう年」を判定することができます。
import calendar
from datetime import datetime
print(calendar.isleap(datetime.now().year)) # Trueと表示される
calendarモジュールのisleapメソッドを使うと引数に入れたdatetime型がうるう年かをTrue ,Falseで返してくれます。
うるう年に関連して月の末日を知りたい時がありますが、こちらもcalendarモジュールの中にあるmonthrangeというメソッドで取得できます。
import calendar
from datetime import datetime
d = calendar.monthrange(2024,2) # (3, 29)と表示される
monthrangeメソッドは月初日の曜日(インデックス番号)と月末日をタプル型にして返してくれます。
そのため末日だけ欲しい時は以下のように分割代入すればOKです。
import calendar
from datetime import datetime
d = calendar.monthrange(2024,2) # (3, 29)と表示される
# ここを追加
d1,d2 = calendar.monthrange(2024,2)
print(d2) # 29と表示される
Pythonのdate型で日付の計算をする方法
datetime型とは別にdate型というデータの種類もあり、似たようなものですが厳密には違うデータです。
同じdatetimeモジュールからdateメソッドをインポートして使い、datetime型と違ってdate型は年、月、日までの取得になります。
from datetime import date
new_date = date(2024,2,4)
print(new_date) # 2024-02-04と表示される
また本日を取得するときはtodayメソッドというものを使います。
from datetime import date
new_date = date(2024,2,4)
print(new_date)
# ここを追加
print(date.today()) # 本日の日付が表示される
datetime型とdate型で同じようなことをしてもメソッド名が違いますね。
ただ一方で文字列からの変換についてはdate型専用のメソッドがなく、datetime.strptimeメソッドを実行した後にdateメソッドを取得する書き方になります。
from datetime import datetime
# 文字列→date型(strptimeに続けてdateメソッドを実行する)
str_date = datetime.strptime("2024/2/4", "%Y/%m/%d").date()
print(str_date) # 2024-02-04が表示される
print(type(str_date)) # class datetime.dateと表示される
date型から文字列に戻すときもdate型専用のメソッドがないのでdatetime.strftimeメソッドを使います。
from datetime import datetime
# date型→文字列(文字列に戻すだけだからstrftimeだけ実行すれば良い)
date_str = str_date.strftime("%Y年%m月%d日")
print(date_str) # 2024年02月04日と表示される
print(type(date_str)) # class strと表示される
Pythonで日付の計算をする方法
続いて日付の計算ですがdate型同士であれば下記のようにシンプルにマイナスするだけです。
from datetime import datetime,date,time,timedelta
date1 = date(2024,2,4)
date2 = date(2024,2,10)
print(date2 - date1) # 6 days, 0:00:00と表示される
ただし片方が文字列だった場合には計算できませんので先ほどのdate型への変換を先にやっておく必要があるので注意してください。
日付の計算で「○日前、○日後」という計算もあり、そちらはtimedeltaというメソッドを使用します。
from datetime import datetime,date,time,timedelta
date3 = date(2024,2,10)
# 2月10日の10日前
print(date3 - timedelta(days=10)) # 2024-01-31 12:00:00と表示される
# 2月10日の10日後
print(date3 + timedelta(days=10)) # 2024-02-20 12:00:00と表示される
アプリ開発で日付の表記や動的に日付を変化させることは頻出の機能なので練習しておきましょう。