2016-11-17 65 views
0

我有這條巨蟒功能的結尾:日曆功能也停在一個月

import datetime 
def date_by_adding_business_days(from_date, add_days,holidays): 
    business_days_to_add = add_days 
    current_date = from_date 
    while business_days_to_add > 0: 
     current_date += datetime.timedelta(days=1) 
     weekday = current_date.weekday() 
     if weekday >= 5: 
      continue 
     if current_date in holidays: 
      continue 
     business_days_to_add -= 1 
    return current_date 
Holidays =[datetime.datetime(2015,10,3),datetime.datetime(2015,10,4)] 
print date_by_adding_business_days(datetime.date(2015,10,23), 6,Holidays) 

這將輸出:

2015-11-02 

我要的是做出改變的是輸出日期將停止在本月底,對於我的例子,我需要輸出2015-10-30。對於任何給定的日期,我不希望輸出超出給定的日期月份。如果我可以說:datetime.date(2015,10,29),並且我想添加5天,則應該輸出2015-10-30(僅添加1天)等等。假期(標記在我的列表中)和週末不計算在內。

enter image description here

謝謝

+1

什麼是你的問題? – eyllanesc

+0

在我的文章中:''我想要做的是輸出日期在月末停止' – Bogdan

+0

您的意思是它會在02 - 30之間運行? – Inconnu

回答

0

您可以使用calendar.monthrange返回元組(first weekday of month, days in month)找出多少天有在特定的月份:

>>> import calendar 
>>> calendar.monthrange(2015, 10) 
(3, 31) 

然後你就可以改變你的函數存儲每次達到循環結束時的潛在結果。最重要的是你需要的holidays的類型更改爲date而不是datetime因爲它們是不同的對象:

>>> import datetime 
>>> datetime.datetime(2016, 11, 17) == datetime.date(2016, 11, 17) 
False 

隨着上述變化的最終結果將是這個樣子:

import datetime 
import calendar 

def date_by_adding_business_days(from_date, add_days,holidays): 
    business_days_to_add = add_days 
    current_date = from_date 
    result = None 
    _, days_in_month = calendar.monthrange(current_date.year, current_date.month) 
    while business_days_to_add > 0 and current_date.day < days_in_month: 
     current_date += datetime.timedelta(days=1) 
     weekday = current_date.weekday() 
     if weekday >= 5: 
      continue 
     if current_date in holidays: 
      continue 
     business_days_to_add -= 1 
     result = current_date 
    return result 
Holidays =[datetime.date(2015,10,3),datetime.date(2015,10,4)] 
print date_by_adding_business_days(datetime.date(2015,10,23), 6,Holidays) 

輸出:

2015-10-30 
+0

我不會只工作1個月,我需要一個全年的範圍,我將適用我的功能的日期將是隨機的,我可以有一個在6月的日期爲例等等。 – Bogdan

+0

而且輸出2015-10-31是週末,週末不算!我們不能在週末或節日期間輸出。 – Bogdan

+0

@AnakinVader解決了週末的問題。如果您通過星期六的'(2015,10,31)'作爲'from_date',預期的輸出是多少?根據問題假期或週末不應退回,但返回日期不應在隨後的月份。 – niemmi

相關問題