【问题标题】:Calculate how many weeks make up 30 weekdays?计算 30 个工作日是多少周?
【发布时间】:2017-01-11 23:17:07
【问题描述】:

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

例如,如果我从 2017 年 1 月 11 日开始,那么在 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 周数,这是不正确的。

【问题讨论】:

标签: python python-2.7 datetime


【解决方案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 天,也就是第 21 天,因为我将开始日期排除在外。如果你愿意,很容易改变。

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

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

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

注意:我在代码中使用了 Python 3。因此,最后一个示例将在 Python 2 上进行整数除法并仅输出 6

【讨论】:

    【解决方案2】:
    print datetime.datetime.isocalendar(enddate)[1] - datetime.datetime.isocalendar(startdate)[1]
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 2021-05-09
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2011-12-05
      • 2023-02-13
      相关资源
      最近更新 更多