当前位置: 首页 > 面试题库 >

Python中的第n个工作日计算-此代码有什么问题?

栾钟展
2023-03-14
问题内容

我正在尝试计算给定日期的第n个工作日。例如,我应该能够计算给定日期的月份中的第三个星期三。

我已经编写了2个版本的函数,该代码可以做到这一点:

from datetime import datetime, timedelta

### version 1
def nth_weekday(the_date, nth_week, week_day):
    temp = the_date.replace(day=1)
    adj = (nth_week-1)*7 + temp.weekday()-week_day
    return temp + timedelta(days=adj)

### version 2
def nth_weekday(the_date, nth_week, week_day):
    temp = the_date.replace(day=1)
    adj = temp.weekday()-week_day
    temp += timedelta(days=adj)
    temp += timedelta(weeks=nth_week)
    return temp

控制台输出

# Calculate the 3rd Friday for the date 2011-08-09
x=nth_weekday(datetime(year=2011,month=8,day=9),3,4)
print 'output:',x.strftime('%d%b%y')

# output: 11Aug11 (Expected: '19Aug11')

这两个函数中的逻辑显然是错误的,但是我似乎无法找到该错误-任何人都可以发现该代码出了什么问题-以及如何解决该问题以返回正确的值?


问题答案:

您的问题在这里:

adj = temp.weekday()-week_day

首先,您用错误的方式减去东西:您需要从所需的日期减去实际的日期,而不是相反。

其次,您需要确保减法的结果不是负数-应该使用将其放在0-6的范围内% 7

结果:

adj = (week_day - temp.weekday()) % 7

此外,在第二个版本中,您需要nth_week-1像在第一个版本中一样增加几周的时间。

完整的例子:

def nth_weekday(the_date, nth_week, week_day):
    temp = the_date.replace(day=1)
    adj = (week_day - temp.weekday()) % 7
    temp += timedelta(days=adj)
    temp += timedelta(weeks=nth_week-1)
    return temp

>>> nth_weekday(datetime(2011,8,9), 3, 4)
datetime.datetime(2011, 8, 19, 0, 0)


 类似资料:
  • 问题内容: 因此,我试图使用ctypes模块制作一个Python 3.3程序来更改Windows桌面背景。我已经在Python 2.7中测试了以下代码,并且运行良好。但这仅在Python 3.3中不起作用!我使用的是Windows7。代码如下: 问题答案: 需要一个8位ANSI编码的输入字符串作为参数,这在Python中被称为encoding 。 您将不得不在python3中使用。这是因为接受UT

  • 1. 2. 如果我错了,请纠正我。谢谢大家!:) 根据我迄今为止的理解: < code>JNZ如果不等于零则跳转,它是否跳转取决于< code>ZF是否设置为1。如果是1,它不会跳。否则,它会跳起来。 根据我对代码#1的理解,< code >测试EAX,EAX将检查它是否为零。如果它不等于零(< code>ZF为0),它将跳转到地址00407190。 对于代码#2 将把EAX寄存器设置为0。它是否

  • 我有下面的代码用于在Python中计算一个数的阶乘。但我不明白为什么我得到的答案是1。有人能纠正我的代码吗。我想在不使用递归的情况下计算阶乘。

  • 我从Horstmann book(Volume2)中复制了代码示例,不明白为什么它不能工作。你能帮我吗?我试图删除IOException,但它引发了另一个问题 控制台日志

  • 问题内容: 为什么在下面的程序中不执行func3?在func1之后,不需要对func2进行评估,但是对于func3,不是吗? 问题答案: 您正在使用短路或。如果第一个参数为true,则整个表达式为true。 如果添加编译器使用的隐式括号可能会有所帮助 编辑 :正如Chris Jester-Young所说,这实际上是因为逻辑运算符必须从左到右的关联性: func1返回之后,它变为: 评估短路或后,它

  • 问题内容: 我认为解决此问题的最佳方法就是粘贴我的代码: 如果我先点击 编辑按钮 和比 确认编辑 ,我试图获得(作为结果)的页面标签 FINALLY我在这里 不幸的是,这并不发生。我单击“ 编辑”按钮 ,然后单击“ 确认编辑” ,则什么也没有发生。 我怎么了 干杯 用新版本更新 问题答案: 好吧,那变得复杂了。是否将调用该操作还取决于组件或其父项之一的属性的结果。由于Bean在请求范围内,因此默认