2017-02-06 2 views
4

私は2つの日付間の月のリストを生成しようとしています。例については :「ここに与えられた2つの日付間のすべての月を表示するにはどうすればいいですか?

[datetime.date(2016, 1, 31), 
datetime.date(2016, 2, 28), 
datetime.date(2016, 3, 27), 
datetime.date(2016, 4, 24), 
datetime.date(2016, 5, 22), 
datetime.date(2016, 6, 19), 
datetime.date(2016, 7, 17), 
datetime.date(2016, 8, 14), 
datetime.date(2016, 9, 11), 
datetime.date(2016, 10, 9), 
datetime.date(2016, 11, 6), 
datetime.date(2016, 12, 4), 
datetime.date(2017, 1, 1), 
datetime.date(2017, 1, 29), 
datetime.date(2017, 2, 26), 
datetime.date(2017, 3, 26)] 

2016:私は

このような
startDate = '2016-1-28' 
endDate = '2017-3-26' 

start = date(*map(int, startDate.split('-'))) 
end = date(*map(int, endDate.split('-'))) 

week = start 
dateData = [] 

while week <= end: 
    dateData.append(week) 
    week = week + datetime.timedelta(weeks=4) 

pprint(dateData) 

をしようとしています

datetime.date(2016, 1, 31) 
datetime.date(2016, 2, 28) 
and so on.... 

これは、その結果得られます。

startDate = '2016-1-31' 
endDate = '2017-3-26' 

それはとなるはずです、12 "& "2017、1"は2回繰り返されます。誰も私がこの問題を解決するのを助けることができます。

+0

ライブラリdateutilからrelativedeltaを試みることができる、それは数ヶ月の計算をサポートしてい – thangtn

+0

はい、私はdateutil輸入relativedeltaからやったと(ヶ月= 1)relativedeltaを使用。しかし、これは誤りです。 – nas

+0

「dateutil.relativedelta import relativedelta」から試しましたか? – thangtn

答えて

7

あなたは以下のようにdateutil拡張機能のrelativedeltaメソッドを使用することができます -

from datetime import datetime 
from dateutil.relativedelta import relativedelta 

startDate = '2016-1-28' 
endDate = '2017-3-26' 

start = datetime.strptime(startDate, '%Y-%m-%d').date() 
end = datetime.strptime(endDate, '%Y-%m-%d').date() 
cur_date = start 

while cur_date < end: 
    print cur_date 
    cur_date += relativedelta(months=1) 

に続いては、私はまだ、コメントするのに十分な特権がないんだけど、あなたのプログラムが正確としてやっている出力

2016-01-28 
2016-02-28 
2016-03-28 
2016-04-28 
2016-05-28 
2016-06-28 
2016-07-28 
2016-08-28 
2016-09-28 
2016-10-28 
2016-11-28 
2016-12-28 
2017-01-28 
2017-02-28 
+0

ありがとうございました – nas

+0

あなたはようこそ@nas: –

1

ですそれは言われる。 4週間は28日間に相当します。 1月1日〜1月29日(2017)の違いは28日です。したがって、あなたは同じ月に2回います。

あなたは解決しようとしているものを再定義することができます。しかし、2つの日付の間の何年もの間だけ解決したい場合は、コードを拡張する必要があります。

  1. ループを作成して、何年も何ヶ月も繰り返す必要があります。
  2. 開始年と終了月を確実にするために、開始年と終了年の条件が必要です。

ここでは動作例を示します。開始日と終了日もリストに含まれています。私はそれが役に立てば幸い:

import datetime 

startDate = '2016-1-28' 
endDate = '2017-3-26' 

start = datetime.date(*map(int, startDate.split('-'))) 
end = datetime.date(*map(int, endDate.split('-'))) 

week = start 
dateData = [] 

dateData.append(start) 

rangeYear = (end.year - start.year) 

for i in range(rangeYear + 1): 
    if i == 0: 
     for j in range(1,13-start.month): 
      date = datetime.date(start.year, start.month+j, 1) 
      dateData.append(date) 
    elif (i > 0) & (i < rangeYear): 
     for j in range(1,12): 
      date = datetime.date(start.year+i, j, 1) 
      dateData.append(date) 
    elif i == rangeYear: 
     for j in range(1,end.month): 
      date = datetime.date(start.year+i, j, 1) 
      dateData.append(date) 

dateData.append(end) 
+0

ありがとうございました。あなたのコードは本当に助けになりました。 – nas

+0

私は助けてくれると嬉しかったです。@Ashishははるかに良い答えを持っていました。私は「relativedata」が存在することを知らなかった!ハッピーコーディング:) – NineTails

+0

あなたのコードで、私はstartDate = '2015-4-26' endDate = '2016-5-21'、エラーが表示されます。このコードが必要なのは、差異が365日で、私が問題に言及するのを忘れた場合のみです。そのために残念。 – nas

関連する問題