计算30个工作日中有多少个星期?

2024-09-28 21:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,如果我从2017年11月1日开始,那么在30周内(包括开始日期),结束日期是2017年2月21日。这意味着需要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周,这是不正确的。你知道吗


Tags: importdatetime错误时间数字daysdoitday
2条回答

一种方法是只模拟每天步行,除了事先取消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日,也就是21日,因为我将开始日期排除在外。如果你想的话,很容易改变。你知道吗

然后你可以用这个日期来看看需要多少周

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

或者让end_by_weekdays()直接返回天数,以避免这种反复。你知道吗

注意:我在代码中使用了python3。最后一个例子将在python2上进行整数除法,并只输出6

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

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

相关问题 更多 >