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

标签 python datetime

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

我已经编写了 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

首先,您以错误的方式减去事物:您需要从所需日期中减去实际日期,而不是相反。

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

结果:

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)

关于python - Python 中的第 n 个工作日计算 - 这段代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11883058/

相关文章:

python - 使用 pandas 进行插补

c# - 在 List<T> 中添加 List<DateTime> 值

python - ElasticSearch日期格式,支持小数秒

c# - C# 中的 DateTime 已过去?

python - 从周数获取日期

python - python 中的多处理不打印任何语句

python - Bluez示例-广告间隔linux

python - 用 stub 替换实际组件的方法

Python - 从多个文件的多个字符串中提取文本

asp.net - 如何使用 UTC 时间(asp.net 和 ajax)向用户呈现本地时间