pythonのdatetimeオブジェクトの日付加算、減算方法や time 型の時間操作の方法をわかりやすく解説!

今回は datetime 型の計算方法について詳しく解説いたします。

datetime 型の加減算はそれなりにクセがあって日々使っていても忘れてしまいがちですので、計算方法がわからないという人や忘れてしまった人のために計算方法をわかりやすくまとめておきます。

とくに time 型の計算はひと手間多く計算する必要がありますので、計算方法がわからないという人のために参考になれば幸いです。

ハイライト

datetime の日付操作には timedelta を使用する!
datetime 同士の計算で日付の差分が得られる!
time 型を時間操作したい場合 combine で一度日付に戻す必要がある!

スポンサーリンク
目次

datetimeに日付を加算する(datetime と timedelta の計算)

最初に datetime に日付や時刻を加算する方法です。
基本的には datetime 型の日付操作はこの方法でやることになるので、この方法だけは感覚で覚えておくとよいです。

日数、もしくは時間を特定の日付に加算、減算する方法

datetime 型の日付を操作する方法は datetime 型に timedelta 型のオブジェクトを足したり、引いたりすることで計算することができます。

timedelta オブジェクトは「1日1時間」などの日数を保持しているオブジェクトです。

timedaltaのオブジェクトに [days] の日数や、 [hours] や [minutes]等の時間を指定することで、加減算したい時間のオブジェクトを生成することができます。

このオブジェクトを datetime オブジェクトに加算か、減算することで日数の操作をすることができます。

サンプルコードは以下の通りです。

なお、timedeltaオブジェクトの引数を見ていると気づいた人もいるかもしれませんが、この timedelta オブジェクトには years や months の引数がありません。

つまり、 timedelta オブジェクトでは1年後や1ヶ月後を指定したい場合は (days = 365) や (days = 31) のように指定する必要があります。

ただこれだと、うるう年だったり31日ない月だと想定と違う日付になってしまう可能性があります。
そこで、1年後や1ヶ月後をその月の日数によって左右されないように取得する場合は次の方法で実現することができます。

月単位、もしくは年単位で特定の日付に加算、減算する方法

datetime型の日付から一か月後、もしくは一年後単位で日付を操作したい場合、 timedelta 型のオブジェクトで日数単位でしか操作できずやりにくいです。

この時に役立つのが [relativedelta] ライブラリです。
[relativedelta] ライブラリはデフォルトで入っているライブラリですので別途インストールする必要もありません。

時間操作の必要は以下のようになります。

チェックポイント

日付の加算は、日数単位、時間単位で計算したい場合は timedelta を使用する!
月、年単位で計算したい場合は relativedelta ライブラリを使用する!

日付の差分を取得する(datetime同士の計算)

日付の差分を取得する場合は datetime 差分を取得したい日付の2つの datetime オブジェクトを差し引きすることで得ることができます。
そして得られた日付の差分は 日付の加減算に用いられる timedelta オブジェクトとして取得されます。

timedelta オブジェクトは日数を保持するオブジェクトなので、日付同士の計算から求めることができるというわけですね。

サンプルコードは以下の通りです。

時刻(datetime.time)の加減算を行う

日付の加減算は上記のようにしてできるため結構直感的に操作できると思いますが、time 型 (datetime.time) の加減算の場合ひと手間書けないと時間の計算をすることができません。

例えば8時の時間データを取得したい場合 [datetime.time(8,0,0)] で取得することができますが、これを timedelta オブジェクトとそのまま計算してしまうと以下のような [TypeError] が生じてしまいます。

TypeError: unsupported operand type(s) for -: ‘datetime.time’ and ‘datetime.timedelta’

datetime 型はそのまま計算できるのに time 型の計算はサポートされていないという結構不親切なことを言ってきます。
time 型でも計算できるようにしてくれ…笑

そのため、 time 型の時間を操作するには一度 datetime 型に変換してから時間操作し、戻してあげる必要があります。

サンプルコードは以下の通りです。

上記のように一旦、combine 関数で datetime にしてから計算し、time 型に戻しています。
表示だけで余暇ればdatetime 型の strftime プロパティを使うことで時間表示させることができます。

時刻同士 (datetime.time) を計算する

次に time 型同士の計算方法について解説します。

time 型同士でも計算するには上記のように一度 datetime 型にして計算する必要があります。
同じ time 型なのに TypeErrorになるってどういうこと…笑

サンプルコードは以下の通りです。

こちらも一旦combine 関数で datetime にしてから計算し、time 型に戻しています。
なお、 datetime 型同士の計算からは timedelta オブジェクトが取得できますが、 timedeta オブジェクトは時間や分といったプロパティを持っておらず、秒しかプロパティとして持っていないので、秒から再計算する必要があります。

特に time 型に戻す必要がないのであればそのまま取得した timedelta オブジェクトを使ってあげれば大丈夫です。

以上で、 datetime 型の計算方法については完了です。
datetime の計算はよくやることだと思いますので上記の解説でスムーズに計算できるようになれば幸いです。

そのほかの datetime の使い方については改めて別途記事にします。
今回はここまでです。
お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる