エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Pythonのdatetimeライブラリで日付/日時/時刻の取得や演算を行う方法をまとめてみました。
なお、本記事内のPythonソースコードは、Visual Studio Code (VS Code)で動作を確認しています。
同様に動作確認したい方はこちらの記事も参照し、まずはVS Codeの環境構築をおこなうとよいでしょう。
Pythonライブラリ(time, datetime)で日付・日時・時刻を扱う
Pythonで日付・日時・時刻を扱うには、標準ライブラリのtimeかdatetimeを使います。
標準ライブラリのtimeは、UNIX時間(エポック秒)でfloat型で取得したい場合に使います。
標準ライブラリのdatetimeは、日時(日付と時刻)を表すdatetimeオブジェクト、dateオブジェクト、timeオブジェクトとして扱いたい場合に使います。
各オブジェクトについては、後述しています。
datetime使い方【基本編】(サンプルコード付き)
標準ライブラリdatetimeの基本的な使い方をサンプルコード付きで解説していきます。
datetimeが扱うオブジェクトの種類
datetimeを使いこなすためにdatetimeが扱っているオブジェクトの種類を紹介します。
datetimeオブジェクト
datetimeのdatetimeオブジェクトは、日付(年、月、日)と時刻(時、分、秒、マイクロ秒)の両方の情報を持つオブジェクトです。
日付や時刻の各情報は、属性year, month, day, hour, minute, second, microsecondでアクセスすることができます。
dateオブジェクト
datetimeのdateオブジェクトは、日付(年、月、日)の情報を持つオブジェクトです。
日付情報は、属性year, month, dayでアクセスすることができます。
timeオブジェクト
datetimeのtimeオブジェクトは、時刻(時、分、秒、マイクロ秒)の情報を持つオブジェクトです。
時刻情報は、属性hour, minute, second, microsecondでアクセスできます。
timedeltaオブジェクト
datetimeオブジェクトやdateオブジェクト同士の演算結果として生成されるオブジェクトです。
日付・日時・時刻を扱うPythonのdatetimeの宣言方法
datetimeを使うためには、以下のように「import datetime」を宣言する必要があります。
1 |
import datetime |
現在の日付を取得(date.today())
現在の日付を取得するには、以下のようにdatetimeライブラリのdateオブジェクトのtoday()メソッドを使用します。
1 2 3 4 |
datetime.date.today() # 2021-07-22 type(datetime.date.today()) # <class 'datetime.date'> |
データ型を確認すると、「datetime.date」クラスのオブジェクトであることがわかります。
現在の日時を取得(datetime.now() / datetime.today())
現在の日時・時刻を取得するには、以下のようにdatetimeライブラリのdatetimeオブジェクトのnow()メソッド、またはtoday()メソッドを使用します。
1 2 3 4 5 6 7 8 9 |
datetime.datetime.now() # 2021-07-22 11:12:42.974411 type(datetime.datetime.now()) # <class 'datetime.datetime'> datetime.datetime.today() # 2021-07-22 11:12:42.975404 type(datetime.datetime.today()) # <class 'datetime.datetime'> |
データ型を確認すると、「datetime.datetime」クラスのオブジェクトであることがわかります。
指定の日付を取得(datetime.date(YYYY, MM, DD))
指定の日付を取得するには、datetimeのdateメソッドの引数に年、月、日を指定します。
1 2 3 4 5 |
datetime.date(2020, 12, 17) # 2020-12-17 type(datetime.date(2020, 12, 17)) # <class 'datetime.date'> |
データ型を確認すると、「datetime.date」クラスのオブジェクトであることがわかります。
指定の日時を取得(datetime.datetime(YYYY, MM, DD, hh, mm, ss, ms))
datetimeのdatetimeメソッドの引数に年、月、日、時、分、秒、マイクロ秒を指定することで、指定の日時を取得することができます。
1 2 3 4 5 |
datetime.datetime(2020, 12, 17, 13, 32, 47) # 2017-11-12 09:55:28 type(datetime.datetime(2020, 12, 17, 13, 32, 47)) # <class 'datetime.datetime'> |
データ型を確認すると、「datetime.datetime」クラスのオブジェクトであることがわかります。
年・月・日・時・分・秒・マイクロ秒を取得
年・月・日・時・分・秒・マイクロ秒を取得するには、属性year, month, day, hour, minute, second, microsecondでアクセスすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
date = datetime.datetime.now() print("年:", date.year) print("月:", date.month) print("日:", date.day) print("時:", date.hour) print("分:", date.minute) print("秒:", date.second) print("マイクロ秒:", date.microsecond) # 年: 2021 # 月: 7 # 日: 22 # 時: 11 # 分: 25 # 秒: 50 # マイクロ秒: 258945 |
曜日を取得(datetime.date(YYYY, MM, DD).weekday())
曜日を取得するには、以下のようにweekdayメソッドを使います。
1 2 3 4 5 |
print(datetime.date(2021, 7, 17).weekday()) # 5 print(datetime.datetime(2021, 7, 17, 13, 32, 47).weekday()) # 5 |
weekdayメソッドは、各曜日に対応する整数を返します。
1 2 3 4 5 6 7 |
月曜日 → 0 火曜日 → 1 水曜日 → 2 木曜日 → 3 金曜日 → 4 土曜日 → 5 日曜日 → 6 |
上記サンプルコードでは、2021年7月17日が土曜日(5)であることを示しています。
日付情報をタプル形式で取得(timetuple())
日付情報をタプル形式で取得するには、以下のようにtimetupleメソッドを使います。
1 2 3 |
now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now.timetuple()) # time.struct_time(tm_year=2021, tm_mon=7, tm_mday=17, tm_hour=13, tm_min=32, tm_sec=47, tm_wday=3, tm_yday=352, tm_isdst=-1) |
time.struct_timeというクラスで返却され、日付情報の各属性を取得できます。
各属性の意味は、以下の通りです。
1 2 3 4 5 6 7 8 9 |
tm_year=2021 # 年 tm_mon=7 # 月 tm_mday=17 # 日 tm_hour=13 # 時 tm_min=32 # 分 tm_sec=47 # 秒 tm_wday=5 # 曜日 tm_yday=198 # 1月1日から何日目か tm_isdst=-1 # サマータイムが有効なら1、無効なら0、不明なら-1 |
日付のみ取得(date())
日付情報のみを取得するには、以下のようにdateメソッドを使います。
1 2 3 |
now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now.date()) # 2021-07-17 |
時間のみ取得(time())
時間情報のみを取得するには、以下のようにtimeメソッドを使います。
1 2 3 |
now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now.time()) # 13:32:47 |
datetime使い方【実践編】(サンプルコード付き)
標準ライブラリdatetimeの実践的な使い方をサンプルコード付きで解説していきます。
datetimeで日付の演算(足し算・引き算)
datetimeで日付の足し算や引き算をするには、relativedeltaメソッドを使うと便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import datetime from dateutil.relativedelta import relativedelta now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now + relativedelta(years=5)) # 2024-07-17 13:32:47 print(now + relativedelta(months=1)) # 2021-08-17 13:32:47 print(now + relativedelta(weeks=2)) # 2021-07-31 13:32:47 print(now + relativedelta(days=5)) # 2021-07-22 13:32:47 print(now + relativedelta(hours=3)) # 2021-07-17 16:32:47 print(now + relativedelta(minutes=10)) # 2021-07-17 13:42:47 print(now + relativedelta(seconds=15)) # 2021-07-17 13:33:02 print(now - relativedelta(years=5)) # 2016-07-17 13:32:47 print(now - relativedelta(months=1)) # 2021-06-17 13:32:47 print(now - relativedelta(weeks=2)) # 2021-07-03 13:32:47 print(now - relativedelta(days=5)) # 2021-07-12 13:32:47 print(now - relativedelta(hours=3)) # 2021-07-17 10:32:47 print(now - relativedelta(minutes=10)) # 2021-07-17 13:22:47 print(now - relativedelta(seconds=15)) # 2021-07-17 13:32:32 |
relativedeltaメソッドを使うと、1年後の日付や1ヶ月前の日付など簡単に計算することができます。
datetimeで日時の比較
datetime.datetimeクラスのオブジェクト同士で日時の比較を行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
datetime1 = datetime.datetime(2021, 7, 17, 13, 32, 47) datetime2 = datetime.datetime(2021, 9, 12, 9, 10, 32) print((datetime1 > datetime2)) # False print((datetime1 >= datetime2)) # False print((datetime1 < datetime2)) # True print((datetime1 <= datetime2)) # True print((datetime1 == datetime2)) # False |
datetimeで日付のフォーマット変換
日付情報のフォーマット変換方法について紹介します。
文字列→日付型(strptimeメソッド)
datetimeのstrptimeメソッドを使うと、日付や時刻を表す文字列からdatetimeオブジェクトの日付型に変換できます。
1 2 3 4 5 6 7 |
date_str = '2021-07-17 13:37:12' date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S') print(date_dt) # 2021-06-27 13:37:12 print(type(date_dt)) # <class 'datetime.datetime'> |
strptimeメソッドの第二引数には、元の文字列に対応する書式化文字列を指定する必要があります。
書式化文字列には、以下のような種類があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
%Y → 西暦4桁の10進表記 %m → 0埋めした10進数で表記した月 %d → 0埋めした10進数で表記した月中の日にち %H → 0埋めした10進数で表記した時 (24時間表記) %I → 0埋めした10進数で表記した時 (12時間表記) %M → 0埋めした10進数で表記した分 %S → 0埋めした10進数で表記した秒 %b → ロケールの月名の短縮形 %B → ロケールの月名 |
日付型→文字列(strftimeメソッド)
datetimeのstrftimeメソッドを使うと、datetimeオブジェクトの日付型から日付や時刻を表す文字列に変換できます。
1 2 3 4 5 6 |
now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now) # 2021-07-17 13:32:47 print(now.strftime('%Y年%m月%d日 %H:%M:%S')) # 2021年07月17日 13:32:47 |
strftimeメソッドの引数に文字列フォーマットを指定することで、任意の文字列フォーマットに変換できます。
日付型→文字列(isoformatメソッド)
datetimeのisoformatメソッドを使うと、datetimeオブジェクトの日付型からISOフォーマットの文字列に変換できます。
1 2 3 4 5 6 |
now = datetime.datetime(2021, 7, 17, 13, 32, 47) print(now) # 2021-07-17 13:32:47 print(now.isoformat()) # 2021-07-17T13:32:47 |
pytzタイムゾーンの設定
タイムゾーンを設定する場合は、datetime.nowメソッドの引数にタイムゾーンを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import datetime import pytz # タイムゾーン設定なし now = datetime.datetime.now() print(now) print(now.tzinfo) # None # タイムゾーンにUTCを設定 now = datetime.datetime.now(datetime.timezone.utc) print(now) print(now.tzinfo) # UTC # タイムゾーンにUTC+9時間を設定 now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))) print(now) print(now.tzinfo) # UTC+09:00 # タイムゾーン「Asia/Tokyo」(UTC+9時間)を設定 now = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) print(now) print(now.tzinfo) # UTC+09:00 |
まとめ
いかがでしたでしょうか。
Pythonの標準ライブラリdatetimeで日付/日時/時刻の取得や演算を行う方法を紹介してきました。
日付を表す文字列から日付型への変換や、日付型から文字列への変換もよく使うので、ぜひこの機会に覚えて頂ければ業務に役立つこと間違いありません。
【関連記事】
【TIPS】PythonでのCSVファイル読み込み、書き込み操作まとめ
【TIPS】データ分析ならコレ!Python Pandas使い方まとめ(DataFrame編)