Python で datetime.date オブジェクトに「3 か月」を追加するにはどうすればよいでしょうか? 質問する

Python で datetime.date オブジェクトに「3 か月」を追加するにはどうすればよいでしょうか? 質問する

Python の日付計算はどこにありますか?

私は数年間、3 か月ごとに日付をプロットする必要がある Python アプリを持っています。日付が 1 年に 4 回正確に発生すること、日付が毎年できるだけ同じ日に発生すること、日付ができるだけ毎月同じ日に発生すること、日付ができるだけ「3 か月」間隔に近くなること (これは特にうるう年では変動します) が重要です。残念ながら、datetime.timedelta月はサポートされていません。

Python でこの計算を実行する「標準的な」方法はありますか?

SQL の方法ですか?

最悪の場合、私は諦めて、日付計算の優れた組み込みサポートを持つ PostgreSQL に次のように答えを問い合わせるアプリを作成します。

# select ('2010-11-29'::date + interval '3 months')::date;
    date    
------------
 2011-02-28
(1 row)

ベストアンサー1

正確な日付や「より正確な」日付を探している場合は、おそらく以下をチェックしたほうがよいでしょう。日付ユーティリティ

簡単な例:

>>> from dateutil.relativedelta import relativedelta
>>> import datetime
>>> TODAY = datetime.date.today()
>>> TODAY
datetime.date(2012, 3, 6)

ここで に 3 か月を追加しTODAY、それが日付と正確に一致することを確認します ( と は動作が異なることに注意してくださいrelativedelta(months=3)relativedelta(month=3)これらmonthsの例では を必ず使用してください)。

>>> three_mon_rel = relativedelta(months=3)
>>> TODAY + three_mon_rel
datetime.date(2012, 6, 6)

そして、それは 1 年を通して一定に保たれます。文字通り 3 か月ごとに、その日 (何らかの理由で を乗算してオブジェクトrelativedeltaに追加すると がスローされるため、追加し続ける必要がありました)。datetime.dateTypeError

>>> TODAY + three_mon_rel + three_mon_rel
datetime.date(2012, 9, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2012, 12, 6)
>>> TODAY + three_mon_rel + three_mon_rel + three_mon_rel + three_mon_rel
datetime.date(2013, 3, 6)

一方、mVChrの提案する解決策は、確かに「十分良い」ものですが、時間の経過とともに少しずつ変化します。

>>> three_mon_timedelta = datetime.timedelta(days=3 * 365/12)
>>> TODAY + three_mon_timedelta
datetime.date(2012, 6, 5)

そして、1 年の間に、月の日付は移動し続けます。

>>> TODAY + three_mon_timedelta * 2
datetime.date(2012, 9, 4)
>>> TODAY + three_mon_timedelta * 3
datetime.date(2012, 12, 4)
>>> TODAY + three_mon_timedelta * 4
datetime.date(2013, 3, 5)

おすすめ記事