2015-12-30 120 views
2

我正在使用Robot Framework進行測試,需要創建自己的Python關鍵字。計算距離今天5天后的日期,並在接下來的5天內爲每個週末添加額外的一天,即週末日

以當前日期爲第0天(明天爲第1天),我試圖計算從今天開始的5天后的日期。如果接下來5天的任何一天是星期六,我需要在計算中添加額外的一天。如果其中任何一天是星期日,也是一樣。

作爲一個Python初學者,我出我的深度一點,所以任何幫助,將不勝感激

+2

難道不是在這種情況下,爲SA/SU增加5天和1天實際上與增加一整週(7天)相同嗎?如果你不需要任何通用的東西,你可以簡單地使用'dt + timedelta(days = 7)' – eumiro

+0

來添加7天,除非它是星期一。然後你只是返回'星期五' – ssm

+0

星期一的第五天是星期六。 – Mel

回答

1

基本上你需要添加5個工作日......這應該這樣做:

import datetime 
def addBusinessDays(from_date, add_days): 
    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: # sunday = 6 
      continue 
     business_days_to_add -= 1 
    return current_date 

#demo: 
print '5 business days from today:' 
print addBusinessDays(datetime.date.today(), 5) 

更新:

這裏的解釋是:

  1. 我們拿到的開始日期(日期,我們需要增加業務天)
  2. 我們使用循環一次添加第1天到日期(我們使用datetime.timedelta(天= 1)添加1天迄今)
  3. 添加每一天後,我們檢查看看如果更新的日期是星期幾。如果是平日,我們算什麼,否則我們不指望它繼續
+0

有更多的解釋會很好,所以初學者可以理解。 – Mel

1

你可以這樣做數學:

from datetime import timedelta 

def business_days(date, days): 
    if days == 0: 
     return date 
    day = date.weekday() 
    if day in (5, 6): 
     date += timedelta(days=7 - day) 
     days -= 1 
    date += timedelta(days=days/5 * 7) 
    return date + timedelta(days=days % 5) 

它將努力從或因爲得到一個日期n工作日不管你約會通過:

In [6]: dte = datetime.datetime.today() 

In [7]: business_days(dte, 5) 
Out[7]: datetime.datetime(2016, 1, 6, 11, 28, 38, 264331) 

In [8]: business_days(dte, -5) 
Out[8]: datetime.datetime(2015, 12, 23, 11, 28, 38, 264331) 
0

如果你想使用很多時間序列,看看pandas。添加五個工作日是相當簡單:

from datetime import datetime 
import pandas as pd 

today = datetime.today() 
then = today + pd.tseries.offsets.BDay(5) 
0

使用NumPy的,你可以找到加上或減去工作日使用np.busday_offset

由於2016-03-27是星期天,滾滾向前返回第一個有效的工作日,2016-03-28

import numpy as np 
np.busday_offset('2016-03-27', 0, roll='forward') 
# numpy.datetime64('2016-03-28') 

爲了獲得datetime對象,調用item()

np.busday_offset('2016-03-27', 0, roll='forward').item() 
# datetime.date(2016, 3, 28) 

爲了推進5個工作日內,第二個參數更改爲5:

np.busday_offset('2016-03-27', 5, roll='forward').item() 
# datetime.date(2016, 4, 4) 

要返回5個工作日內,使用負偏移和滾動= '落後':

np.busday_offset('2016-03-27', -5, roll='backward').item() 
# datetime.date(2016, 3, 18) 

np.busday_offset('2016-03-28', -5, roll='backward').item() 
# datetime.date(2016, 3, 21) 
相關問題