簡體   English   中英

計算從今天起5天的日期,在接下來的5天(周末)中的每一天增加一天

[英]Calculate date 5 days from today, adding an extra day for each day in the next 5 days that is a weekend day

我正在使用Robot Framework進行測試,並且需要創建自己的Python關鍵字。

以當前日期為第0天(明天為第1天),我試圖計算從今天起5天的日期。 如果接下來5天內的任何一天是星期六,我需要在計算中增加一整天。 如果有一天是星期日,則相同。

作為Python初學者,我有點不精打采,所以任何幫助將不勝感激

基本上,您需要添加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(days = 1)來添加1天到日期)
  3. 添加完每一天后,我們檢查更新日期是否為工作日。 如果是工作日,我們將其計算在內,否則我們將不計算並繼續

您可以用數學方法做到這一點:

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)

使用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個工作日,請使用負偏移量,然后roll ='backward':

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)

以下是日歷,可供參考:

      March 2016               April 2016         
 Su Mo Tu We Th Fr Sa     Su Mo Tu We Th Fr Sa    
        1  2  3  4  5                     1  2    
  6  7  8  9 10 11 12      3  4  5  6  7  8  9    
 13 14 15 16 17 18 19     10 11 12 13 14 15 16    
 20 21 22 23 24 25 26     17 18 19 20 21 22 23    
 27 28 29 30 31           24 25 26 27 28 29 30    

如果要處理大量時間序列,請查看pandas 添加五個工作日非常簡單:

from datetime import datetime
import pandas as pd

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM