Pythonで日付と時刻を扱うのには、datetimeモジュールを使います。
この記事では、datetimeモジュールと、日付と時刻の計算に便利なdateutil.relativedeltaモジュールについて解説します。
datetime
datetimeは日付と時刻を格納します。
現在の日付と時刻を取得するのは、datetime.now()を使います。
>>> from datetime import datetime >>> datetime.now() datetime.datetime(2020, 11, 19, 11, 47, 58, 831194)
datetimeにはマイクロセカンドまで格納されていますので、緻密な時間計算もできます。
date
date日付を格納します。
現在の日付を取得するのは、date.today()を使います。
>>> from datetime import date >>> date.today() datetime.date(2020, 11, 19)
time
timeは時刻を格納します。
現在時刻を取得するメソッドは用意されていません。
それと、
import time
で取得するtimeモジュールとは別物ですので注意してください。
こちらのtimeはスリープ処理に使われます。
>>> import time >>> time.sleep(1)
文字列との変換
datetimeを文字列に変換するのはstrftime、文字列をdatetimeに変換するのはstrptimeを使います。
>>> from datetime import datetime >>> str = datetime.now().strftime('%Y年%m月%d日 %H時%M分%S秒') >>> str '2020年11月19日 12時04分18秒' >>> dt = datetime.strptime(str, '%Y年%m月%d日 %H時%M分%S秒') >>> dt datetime.datetime(2020, 11, 19, 12, 4, 18)
ここで、%Yとか%mとかいう識別子はそれぞれ年や月を表します。
AwareとNaive,tzinfo
日時のオブジェクトは、それらがタイムゾーンの情報を含んでいるかどうかによって “aware” あるいは “naive” に分類されます。
引用:https://docs.python.org/ja/3/library/datetime.html
datetimeは、タイムゾーンの情報を含むawareタイプとタイムゾーンの情報を含まないnaiveタイプに分類されます。
タイムゾーンの情報はtzinfoで与えます。
>>> from datetime import datetime >>> now = datetime.now() >>> time1 = datetime(now.year, now.month, now.day, tzinfo=timezone(timedelta(hours=9))) >>> time2 = datetime(now.year, now.month, now.day) >>> time1 datetime.datetime(2020, 11, 19, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))) >>> time2 datetime.datetime(2020, 11, 19, 0, 0) >>> if time1 != time2: ... print('time1とtime2は違います') ... time1とtime2は違います
timedelta
timedeltaは日付と時刻の計算に使います。
時刻は自由に指定できますが、日付は日しか指定できません。
>>> from datetime import datetime,timedelta >>> now = datetime.now() >>> tommorow = now + timedelta(days=1) >>> now datetime.datetime(2020, 11, 19, 12, 25, 2, 759598) >>> tommorow datetime.datetime(2020, 11, 20, 12, 25, 2, 759598) >>> after1hour = now + timedelta(hours=1) >>> after1hour datetime.datetime(2020, 11, 19, 13, 25, 2, 759598)
relativedelta
年や月を計算に使いたいときは、dateutilモジュールのrelativedeltaを使います。
dateutilモジュールは次のコマンドでインストールします。
pip install python-dateutil
例えば1つ月を足すのは
>>> from datetime import datetime >>> from dateutil.relativedelta import relativedelta >>> now = datetime.now() >>> nextmonth = now + relativedelta(months=1) >>> now datetime.datetime(2020, 11, 19, 12, 33, 22, 959051) >>> nextmonth datetime.datetime(2020, 12, 19, 12, 33, 22, 959051)
で計算できます。
これを使うと、月末の日を求めることもできます。
>>> dt = datetime(now.year, now.month, 1) >>> dt = dt + relativedelta(months=1) >>> dt = dt - relativedelta(days=1) >>> dt datetime.datetime(2020, 11, 30, 0, 0)
まとめ
この記事ではdatetimeモジュールとrelativedeltaについて解説しました。
日付と時刻はその性質上、手軽に扱うというわけにはいきませんが、それでもPythonの場合は比較的簡潔に扱えるということが分かったと思います。
日付と時刻はシステム構築で頻繁に使いますので、慣れていきましょう。