gpt4 book ai didi

python - 计算 30 个工作日有多少周?

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:24 28 4
gpt4 key购买 nike

获取准确的日期总是很棘手。我想知道封装 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 周,这是不正确的。

最佳答案

一种方法是模拟每天走过,除了事先取消 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

关于python - 计算 30 个工作日有多少周?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com