1. ホーム
  2. python

[解決済み] Pythonでdatetimeオブジェクトを1ヶ月インクリメントする簡単な方法はありますか?重複] [重複

2023-05-20 23:51:21

質問

そこで、私はdatetimeオブジェクトを1ヶ月ずつ増加させる方法を見つけようとしています。しかし、これはそれほど単純ではないようです、によると この質問 .

みたいなのを期待してたんだけど。

import datetime as dt

now = dt.datetime.now()
later = now + dt.timedelta(months=1)

でも、それじゃダメなんです。また、可能であれば、次の月の同じ日(または最も近い代替)に移動できることを望んでいました。たとえば、1 月 1 日に設定された datetime オブジェクトは 2 月 1 日に増分するのに対し、2 月 28 日に設定された datetime オブジェクトは 3 月 28 日または何かとは対照的に 3 月 31 日に増分する、などです。

明確には、2 月 28 日は月の最終日であるため、(通常は)3 月 31 日にマップされ、したがって、次の月の最終日に移動するはずです。そうでなければ、直接リンクになります。増分は、同じ番号の日を持つ次の月の日に移動するはずです。

Pythonの現在のリリースでこれを行うための簡単な方法はありますか?

どのように解決するのですか?

チェックアウト from dateutil.relativedelta import * を使用すると、日付に特定の時間を追加するために、引き続き timedelta を使い続けることができます。

import datetime
from dateutil.relativedelta import *
use_date = datetime.datetime.now()

use_date = use_date + datetime.timedelta(minutes=+10)
use_date = use_date + datetime.timedelta(hours=+1)
use_date = use_date + datetime.timedelta(days=+1)
use_date = use_date + datetime.timedelta(weeks=+1)

を使うか、あるいは relativedelta

use_date = use_date+relativedelta(months=+1)

use_date = use_date+relativedelta(years=+1)

来月の最終日に向けて

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)

今、これは2016/02/29を提供します

は来月の最終日です。

use_date = use_date+relativedelta(months=+1)
use_date = use_date+relativedelta(day=31)
use_date = use_date+relativedelta(days=-1)

翌月の最終金曜日

use_date = use_date+relativedelta(months=+1, day=31, weekday=FR(-1))

来月第2火曜日

new_date = use_date+relativedelta(months=+1, day=1, weekday=TU(2))

mrroot5 が指摘するように、dateutil の rrule 関数を適用することができ、日付の出現を必要とする場合、より大きな利益をもたらします。

例えば

先月の末日から9ヶ月分の計算をする。

次に、その月の第2火曜日をそれぞれ計算する。

from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import datetime
use_date = datetime(2020,11,21)

#Calculate the last day of last month
use_date = use_date+relativedelta(months=-1)
use_date = use_date+relativedelta(day=31)

#Generate a list of the last day for 9 months from the calculated date
x = list(rrule(freq=MONTHLY, count=9, dtstart=use_date, bymonthday=(-1,)))
print("Last day")
for ld in x:
    print(ld)

#Generate a list of the 2nd Tuesday in each of the next 9 months from the calculated date
print("\n2nd Tuesday")
x = list(rrule(freq=MONTHLY, count=9, dtstart=use_date, byweekday=TU(2)))
for tuesday in x:
    print(tuesday)

Last day
2020-10-31 00:00:00
2020-11-30 00:00:00
2020-12-31 00:00:00
2021-01-31 00:00:00
2021-02-28 00:00:00
2021-03-31 00:00:00
2021-04-30 00:00:00
2021-05-31 00:00:00
2021-06-30 00:00:00

2nd Tuesday
2020-11-10 00:00:00
2020-12-08 00:00:00
2021-01-12 00:00:00
2021-02-09 00:00:00
2021-03-09 00:00:00
2021-04-13 00:00:00
2021-05-11 00:00:00
2021-06-08 00:00:00
2021-07-13 00:00:00

rrule は、特定の日に発生する次の日付を見つけるために使われるかもしれません。

例:月曜日に発生する次の1月1日(今日が2021年11月4日であると仮定した場合)

from dateutil.relativedelta import *
from dateutil.rrule import *
from datetime import *
year = rrule(YEARLY,dtstart=datetime.now(),bymonth=1,bymonthday=1,byweekday=MO)[0].year
year
2024

または、次の 5 つの 1 月 1 日が月曜日に発生する場合。

years = rrule(YEARLY,dtstart=datetime.now(),bymonth=1,bymonthday=1,byweekday=MO)[0:5]
for i in years:print(i.year)
... 
2024
2029
2035
2046
2052

これは決して利用可能なものの完全なリストではありません。 ドキュメントはこちらでご覧になれます。 https://dateutil.readthedocs.org/en/latest/