计算30个工作日的周数?

时间:2017-01-11 23:17:07

标签: python python-2.7 datetime

准确日期总是很棘手。我想知道封装30个工作日需要多少个星期。开始日期可以是工作日的任何一天。 周末不能算在内。

例如,如果我从 1/11/2017 开始,那么30天工作日(包括开始日期),结束日期 2/21/2017 。这意味着需要 7周

这就是我尝试过的:

由于datetime.isocalendar()可用于确定一年中的周数,我的想法是采取以下措辞:

datetime.isocalendar(enddate) - datetime.isocalendar(startdate)

但我相信我的最终计算错误,所以我得到了奇怪的数字:

import datetime
def doit(month, day):
    startdate = datetime.datetime.strptime("2017-%s-%s" % (month,day),"%Y-%m-%d")
    enddate = startdate + datetime.timedelta(days=41)    
    print datetime.datetime.isocalendar(enddate)[1] - datetime.datetime.isocalendar(startdate)[1]

我做days=41因为每个星期有两个周末,我们没有计算,所以因为30个工作日通常是6周,这意味着6 * 2 + 30 =总共42天。但由于我们计算的是开始日期,因此我们只会添加42-1=41天。

为什么我的号码不正确?例如,如果您输入我上面列出的日期(doit(1,11)),我将获得6周不正确的日期。

2 个答案:

答案 0 :(得分:1)

一种方法是模拟每天行走,除了事先取消5(整周)的倍数

def end_by_weekdays(start, weekdays):
    weeks, weekdays = divmod(weekdays, 5)
    days = 0
    startday = start.weekday()
    while weekdays > 0:
        days += 1
        if (startday + days) % 7 < 5:
            weekdays -= 1
    return start + timedelta(days=days + 7*weeks)

这输出以下内容:

>>> end_by_weekdays(date(2017,1,11), 30)
datetime.date(2017, 2, 22)

请注意,它输出了您的预期日期的第22个insteaf,即第21个,因为我将开始日期视为独占。如果你愿意的话,很容易改变。

然后,您可以使用此日期查看需要多少周

>>> start = date(2017,1,11)
>>> (end_by_weekdays(start, 30) - start).days / 7
6.0

或让end_by_weekdays()直接返回天数以避免此来回。

注意:我在代码中使用了Python 3。所以最后一个例子将在Python 2上进行整数除法,只输出6

答案 1 :(得分:0)

print datetime.datetime.isocalendar(enddate)[1] - datetime.datetime.isocalendar(startdate)[1]

如果工作日是星期一,这句话会给你正确答案!考虑到这种情况,您应该考虑一点点不同开始日可以是一周中的任何一天。