機械学習でPythonを用いて時系列データを扱う際には、日付オブジェクト(Datetime)オブジェクトを扱うことになると思いますが、その扱い方について意外と習熟している人は少ないように思います。
また、Datetimeといっても、文字列の日付があったり、フォーマットがあったり、pandasで扱える日付やmatplotlibで、グラフの軸にしたい時の日付など、同じ日付であっても、使えるメソッドが違うことも多々あり、初心者の人は毎回同じことをググっている…みたいなこともありがちではないでしょうか。
今回は機械学習やデータ分析をする際に、頻繁に利用する日付周りの操作や、そもそものPythonにおけるDatetimeオブジェクトについて解説します。
まずは、必要なライブラリをここでインポートしておきます。
以降の操作では、このライブラリはインポートされている前提で、解説を進めていきます。
from datetime import datetime as dt
from datetime import timedelta as td
DateTimeの基本的な使い方
DateTimeの初期化(コンストラクタ)
dt(2020, 1, 3)
DateTimeの初期化は引数に、year, month, dayを与えるだけでできます。hour, minute, secondはオプション引数なので与えなくても大丈夫です。
オプション引数を与えない場合は、0時0分0秒としてDateTimeオブジェクトが生成されます。
DateTime周りで意外と知らない扱い方
2つの日時の間の日数を取得する
2つの日付の間の日数を得ることができます。
a = dt(2020, 10, 11, 1, 12, 32)
b = dt(2020, 11, 21, 1, 23, 21)
# b - a でTimeDeltaオブジェクトが生成される。
# b -a => datetime.timedelta(days=41, seconds=649)
(b - a).days # => 41
2つの日時の間の日付のリストを取得する
a = dt(2020, 10, 11, 1, 12, 32)
b = dt(2020, 10, 14, 1, 23, 21)
c = [a.replace(hour=0, minute=0, second=0, microsecond=0) + td(days=i) for i in range((b-a).days)]
c
# => [datetime.datetime(2020, 10, 11, 0, 0),
# datetime.datetime(2020, 10, 12, 0, 0),
# datetime.datetime(2020, 10, 13, 0, 0)]
0時0分0秒に丸める
0時0分0秒で丸める場合は次のように行います。
a = dt(2020, 10, 11, 1, 12, 32)
a.replace(hour=0, minute=0, second=0, microsecond=0)
# => datetime.datetime(2020, 10, 11, 0, 0)
matplotlibでの日付の目盛りを扱う方法
matplitlibで日付の目盛りを扱う場合は、少し癖があるので注意が必要です。
matplitlibで日付の目盛りを扱う際には、mdatesモジュールを利用します。