Если вы собираете все даты, созданные путем добавления кратных значений каждого периода, заданного для вашей функции, которые все еще находятся внутри заданного диапазона дат, вы можете собирать их внутри dict.Дата является ключом к вашему диктату, значение списка «периодов», которые достигли этой даты (спасибо @vash_the_stampede - я не совсем понял):
import datetime
def daterecurring(start_date,end_date,p1,p2,p3,p4):
d = {}
p_all = p1+p2+p3+p4
start = datetime.datetime.strptime(start_date, "%d-%m-%Y")
end = datetime.datetime.strptime(end_date, "%d-%m-%Y")
dates = []
curr_date = start
days = 0
for period,num_d in [("Period 1",p1),("Period 2",p2),("Period 3",p3),("Period 4",p4)]:
curr_date = start
while curr_date <= end:
k = d.setdefault(curr_date,[])
k.append(period)
curr_date = curr_date + datetime.timedelta(days=num_d)
# print each date and the list of periods
for date,ps in sorted(d.items()):
for period in ps: # one line per period
print(date.strftime("%d-%m-%Y"), period)
return dates
daterecurring("1-1-2018","1-5-2018",12,5,10,7)
создаст вывод:
01-01-2018 Period 1
01-01-2018 Period 2
01-01-2018 Period 3
01-01-2018 Period 4
06-01-2018 Period 2
08-01-2018 Period 4
11-01-2018 Period 2
11-01-2018 Period 3
13-01-2018 Period 1
15-01-2018 Period 4
16-01-2018 Period 2
21-01-2018 Period 2
21-01-2018 Period 3
22-01-2018 Period 4
25-01-2018 Period 1
26-01-2018 Period 2
29-01-2018 Period 4
31-01-2018 Period 2
31-01-2018 Period 3
05-02-2018 Period 2
05-02-2018 Period 4
06-02-2018 Period 1
10-02-2018 Period 2
10-02-2018 Period 3
12-02-2018 Period 4
15-02-2018 Period 2
18-02-2018 Period 1
19-02-2018 Period 4
20-02-2018 Period 2
20-02-2018 Period 3
25-02-2018 Period 2
26-02-2018 Period 4
02-03-2018 Period 1
02-03-2018 Period 2
02-03-2018 Period 3
05-03-2018 Period 4
07-03-2018 Period 2
12-03-2018 Period 2
12-03-2018 Period 3
12-03-2018 Period 4
14-03-2018 Period 1
17-03-2018 Period 2
19-03-2018 Period 4
22-03-2018 Period 2
22-03-2018 Period 3
26-03-2018 Period 1
26-03-2018 Period 4
27-03-2018 Period 2
01-04-2018 Period 2
01-04-2018 Period 3
02-04-2018 Period 4
06-04-2018 Period 2
07-04-2018 Period 1
09-04-2018 Period 4
11-04-2018 Period 2
11-04-2018 Period 3
16-04-2018 Period 2
16-04-2018 Period 4
19-04-2018 Period 1
21-04-2018 Period 2
21-04-2018 Period 3
23-04-2018 Period 4
26-04-2018 Period 2
30-04-2018 Period 4
01-05-2018 Period 1
01-05-2018 Period 2
01-05-2018 Period 3
Это выглядит несколько более правдоподобно в отношении предоставленного вами образца.