1. ホーム
  2. python

[解決済み] 2つの日付の間の月数を求める最良の方法

2022-05-17 09:03:33

質問

私はPythonで2つの日付の間の月を正確に見つけることができる必要があります。私は動作するソリューションを持っていますが、それは非常に良い(エレガントなように)または高速ではありません。

dateRange = [datetime.strptime(dateRanges[0], "%Y-%m-%d"), datetime.strptime(dateRanges[1], "%Y-%m-%d")]
months = [] 

tmpTime = dateRange[0]
oneWeek = timedelta(weeks=1)
tmpTime = tmpTime.replace(day=1)
dateRange[0] = tmpTime
dateRange[1] = dateRange[1].replace(day=1)
lastMonth = tmpTime.month
months.append(tmpTime)
while tmpTime < dateRange[1]:
    if lastMonth != 12:
        while tmpTime.month <= lastMonth:
            tmpTime += oneWeek
        tmpTime = tmpTime.replace(day=1)
        months.append(tmpTime)
        lastMonth = tmpTime.month

    else:
        while tmpTime.month >= lastMonth:
            tmpTime += oneWeek
        tmpTime = tmpTime.replace(day=1)
        months.append(tmpTime)
        lastMonth = tmpTime.month

ここでやっていることは、2つの日付を受け取って、isoフォーマットからpythonのdatetimeオブジェクトに変換しているところです。そして、開始のdatetimeオブジェクトに週を追加してループし、月の数値が大きいかどうかをチェックします(月が12月でない場合は、日付が小さいかどうかをチェックします)。

完全に動作しますが、良い方法とは思えません...。

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

2018-04-20に更新しました。 は、OPの@Joshkunzが求めていたのはファインディングだったようです。 どの月 を求めるのではなく、「2つの日付の間に何ヶ月あるのか」を求めているようです。そのため、なぜ @JohnLaRooy が100回以上アップヴォートされているのかがよくわかりません。Joshkunzは、元の質問の下のコメントで、実際の日付[または月]が欲しいことを示し、代わりに 月の合計数 .

というわけで、質問は、2つの日付の間について 2018-04-11 から 2018-06-01

Apr 2018, May 2018, June 2018 

の間にある場合はどうでしょうか? 2014-04-11 から 2018-06-01 ? とすると、答えは

Apr 2014, May 2014, ..., Dec 2014, Jan 2015, ..., Jan 2018, ..., June 2018

というわけで、何年も前に次のような疑似コードを持っていたわけです。それは単に、2 つの月をエンド ポイントとして使用し、一度に 1 か月ずつ増分してループすることを提案したものです。Joshkunz は、"month" が欲しいと言いましたが、彼は "dates" も欲しいと言い、正確に分からずに、正確なコードを書くことは困難でしたが、アイデアは、終点をループする 1 つの単純なループを使用し、一度に 1 か月ずつ増加させることです。

8年前の2010年の答えです。

1週間足すと、およそ4.35倍の仕事をすることになります。 なぜそうしないのか。

1. get start date in array of integer, set it to i: [2008, 3, 12], 
       and change it to [2008, 3, 1]
2. get end date in array: [2010, 10, 26]
3. add the date to your result by parsing i
       increment the month in i
       if month is >= 13, then set it to 1, and increment the year by 1
   until either the year in i is > year in end_date, 
           or (year in i == year in end_date and month in i > month in end_date)

は、今のところ pseduo のコードだけで、テストはしていませんが、同じ線上のアイデアはうまくいくと思います。