计算从今天起5天的日期,在接下来的5天(周末)中为每一天添加额外的一天

时间:2015-12-30 09:05:03

标签: python robotframework

我正在使用Robot Framework进行测试,需要创建自己的Python关键字。

将当前日期视为第0天(明天为第1天),我试图计算从今天起5天的日期。如果接下来5天中的任何一天是星期六,我需要在计算中多加一天。如果任何一天是星期天,则相同。

作为一名Python初学者,我有点超出我的深度,所以任何帮助都会非常感激

4 个答案:

答案 0 :(得分: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(days = 1)添加1天到日期)
  3. 每天添加后,我们会检查更新日期是否为工作日。如果它是工作日,我们会计算它,否则我们不计算它并继续

答案 1 :(得分: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)

答案 2 :(得分:1)

使用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)

这是一个日历供参考:

      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    

答案 3 :(得分:0)

如果您想使用大量时间序列,请查看pandas。增加五个工作日非常简单:

from datetime import datetime
import pandas as pd

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