2017-08-08 32 views
-1

我有以下一天類型:如何將規則應用於日期時間變量?

daytypes = { 
    'Holidays_1': (
     date(2017, 4, 20), 
     date(2017, 7, 10) 
    ), 
    'Holidays_2': (
     date(2017, 2, 5), 
     date(2017, 5, 12), 
     date(2017, 12, 14) 
    ) 
} 

我想知道,如果新的日期指的是位於任何節前1天勞動日(週一至週五),它是不是一個節日本身。

例如,我有以下三個datetime變量:

from datetime import datetime 
dt1 = datetime.strptime("2017-02-04 11:12:20.0", "%Y-%m-%d %H:%M:%S.%f") 
dt2 = datetime.strptime("2017-05-11 20:00:00.0", "%Y-%m-%d %H:%M:%S.%f") 
dt3 = datetime.strptime("2017-02-06 12:00:00.0", "%Y-%m-%d %H:%M:%S.%f") 

只有dt2對應於指定的規則。

我該怎麼做?

+0

請詳細說明更 –

+0

@ binu.py:請具體說明究竟是什麼還不清楚,我會詳細說明。 – Dinosaurius

+0

給你一個提示:'timedelta'可用於從'datetime'增加或減少一天。 –

回答

0

我解決這樣說:

holidays = [] 
for d in daytypes: 
    holidays.extend(daytypes[d]) 

if (dt.isoweekday() >= 1 and dt.isoweekday() <= 5 and date(dt.year, dt.month, dt.day + 1) in holidays): 
    print "Date is within 1 day of a holiday." 
else: 
    print "Date is a weekday and not within 1 day of a holiday." 
+0

不錯的@Dinosaurius –

+0

@ binu.py,只是當這一天是本月的最後一天,假期是下個月的第一天時,這種情況會失敗。例如任何12/31。 –

+0

我想如果你使用timedelta它不會 –

1

試試這個

from datetime import datetime as date 
from datetime import timedelta, datetime 

daytypes = { 
    'Holidays_1': (
     date(2017, 4, 20), 
     date(2017, 7, 10) 
    ), 
    'Holidays_2': (
     date(2017, 2, 5), 
     date(2017, 5, 12), 
     date(2017, 12, 14) 
    ) 
} 

holidays = [] 
for d in daytypes: 
    holidays.extend(daytypes[d]) 

dt2 = datetime.strptime("2017-05-11 20:00:00.0", "%Y-%m-%d %H:%M:%S.%f") 

for h in holidays: 
    if h-dt2 < timedelta(1) and h-dt2 > timedelta(0): 
     return True 
+0

在我的情況下,它會打印任何日期的「True」。 – Dinosaurius

+0

我已經更新了我的答案,請檢查,如果你仍然得到真實的一切可能是你正在從過去的日期減去將給你負日差的未來日期。您可能想要處理 –

+0

因此,只需運行「2017-05-11」的示例,我就會得到'真實 假 真 真 假。但答案應該是真的, – Dinosaurius

0

這裏是一個快速的功能來做到這一點。該功能會讀取假期字典,並根據這些假期評估輸入日期,並會返回輸入日期是否爲週末,假日1天內或週末不假日1天內。如果需要,您可以更改函數以返回更多或更少的細節,但這應符合您描述的需求。

def check_holidays(holidays, input_date): 
    if input_date.weekday() >= 5: 
     return 'Is a weekend date' 
    for holiday, holiday_dates in holidays.items(): 
     holiday_range = [] 
     for h_date in holiday_dates: 
      holiday_range.append(h_date) 
      holiday_range.append(h_date - timedelta(days=1)) 
     if input_date.date() in holiday_range: 
      return 'Date is within 1 day of a holiday' 
    return 'Date is a weekday and not within 1 day of a holiday' 
+0

我得到這個錯誤'AttributeError:類型對象'datetime.datetime'沒有屬性'timedelta'',當我運行'check_holidays(daytypes,dt2)' – Dinosaurius

+0

我明白了。因爲你正在做'從datetime import datetime',所以你應該在你的導入中添加'timedelta'來讀取'from datetime import datetime,timedelta'。然後你可以從函數中刪除'datetime'並直接調用'timedelta'。我已更新代碼以顯示此內容。 – vealkind

+0

嗯,它給了我現在的所有條目「日期是一個工作日,而不是在度假的一天之內」。 – Dinosaurius

0

您可以使用weekday()函數來獲取星期幾是日期對象。該函數返回一個從0(星期一)到6(星期日)的整數。

例如:

>>> from datetime import datetime, date 
>>> dt1 = datetime.strptime("2017-02-04 11:12:20.0", "%Y-%m-%d %H:%M:%S.%f") 
>>> holiday1 = date(2017, 02, 05) 
>>> # Is the holiday one day ahead of the date? 
>>> print date(dt1.year, dt1.month, dt1.day + 1) == holiday1 
True 
>>> # Is the date a weekday? 
>>> print dt1.weekday() in range(0,4) # Days from 0 to 4 are working days 
False 

文檔是在這裏:https://docs.python.org/2/library/datetime.html#datetime.date.weekday

編輯:您可以使用一個for循環遍歷每個假期:

for holiday_tuple in daytypes.keys(): 
    for holiday in holiday_tuple: 
     # Do whatever you need here 
     print date(dtx.year, dtx.month, dtx.day + 1) == holiday 

凡DTX是任何聲明的datetime對象。您也可以使用額外的for循環遍歷datetime對象的列表。

+0

在我的情況下,我有一個'daytypes'字典,不只是一個假期。 – Dinosaurius

相關問題