准确日期总是很棘手。我想知道封装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
周不正确的日期。
答案 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]
如果工作日是星期一,这句话会给你正确答案!考虑到这种情况,您应该考虑一点点不同开始日可以是一周中的任何一天。