2017-04-11 2 views
1

Ich definierte eine Funktion zum Erstellen von Business-Datumsbereich mit benutzerdefinierten Feiertagskalender. Ich glaube, ich habe mich selbst in eine Endlosschleife gebracht, weiß aber nicht warum?benutzerdefinierte Python bekommen BDay Bereich

import datetime as dt 

def get_bdate(start, end, hoildays): 
list = [] 
while start < end: 
    if start.weekday() >= 5: # sunday = 6; skipping weekends 
     continue 
    if start in holidays: # holidays is a custom set of dates 
     continue 
    list.append(start) 
    start += dt.timedelta(days=1) 
return list 

Antwort

1

Ihr Problem ist, dass Sie den Start in Ihrer Schleife nicht erhöhen, wenn es sich um einen Wochentag handelt oder wenn es sich um einen Feiertag handelt. Indem Sie einfach continue verwenden, verwenden Sie den gleichen Startwert auf unbestimmte Zeit!

import datetime as dt 

def get_bdate(start, end, hoildays): 
    my_list = [] 
    while start < end: 
     if start.weekday() > 5 or start not in holidays: 
      my_list.append(start) 
     start += dt.timedelta(days=1) 
    return my_list 

Um Ihre früheren Beispiel genauer zu verwenden (obwohl es die start += Linie wiederholt:

import datetime as dt 

def get_bdate(start, end, hoildays): 
    my_list = [] 
    while start < end: 
     if start.weekday() >= 5: # sunday = 6; skipping weekends 
      start += dt.timedelta(days=1) 
      continue 
     if start in holidays: # holidays is a custom set of dates 
      start += dt.timedelta(days=1) 
      continue 
     my_list.append(start) 
     start += dt.timedelta(days=1) 
    return my_list 
+0

Oh Gee habe gerade bemerkt, dass episches Ausfallen –

+0

Bitte markieren!.! als akzeptiert, wenn es Ihnen geholfen hat :) –

+1

@ChristopherApple: Verwenden Sie 'list' als Variablenname clobbers den [eingebauten Typ] (https://docs.python.org/2/library/stdtypes.html#sequence-types -str-Unicode-Liste-Tuple-Bytearray-Puffer-X-Bereich). –

1

Vom documentation:

Die Aussage weiter, auch aus C geliehen, wird mit der nächsten Iteration der Schleife:

Sie müssen Ihren Code ändern, so dass start wird immer inkrementiert:

import datetime as dt 

def get_bdate(start, end, holidays): 
    result = list() 
    while start < end: 
     if start.weekday() >= 5: # sunday = 6; skipping weekends 
      pass 
     elif start in holidays: # holidays is a custom set of dates 
      pass 
     else: 
      result.append(start) 
     start += dt.timedelta(days=1) 
    return result 

Verwenden Sie auch nicht list als Variablennamen, da Sie die built-in type überlisten.

+0

Danke für die Hilfe das ist nützlich –