增加日期而忽略周末

时间:2014-09-10 12:47:35

标签: python date

我目前正在为我的工作场所写支持rota。

代码本身很简单

import itertools

names = ["P1", "P2", "P3"]

extns = {'P1': 'xxxx', 'P2': 'xxxy', 'P3': 'xxyy'}

for _ in itertools.repeat(None, 5):
    for name in names:
        print name + " | " + extns[name]

名称替换为Pn,数字替换为" x / y"替换

到目前为止,它的效果非常好,并且给出了

的预期输出
P1 | xxxx
P2 | xxxy
P3 | xxyy

重复5次。

然而,所需的输出是

| <Todays Date> | P1 | xxxx |

显然,我可以使用日历Lib并使用那里的数据,然后在明天的日期等处理today+1等事情。

尝试跳过周末时会出现问题。

每周工作5天意味着我们不会在周末(周六/周日0000-2400)分配支持

例如9月1日是星期一,所以我希望日期是

01-09-14
02-09-14
03-09-14
04-09-14
05-09-14
08-09-14
09-09-14

正如你所看到的那样,它跳过了第6和第7,因为那是星期六和星期日。

我查看了calendar模块并找到了以下代码:

calendar.setfirstday()

听起来很有希望,我也可以使用

iterweekdays()

返回工作日的迭代器。

我不确定这是否会给出日期,如果我要迭代它。我也不确定如何实际迭代它。

编辑:

预期输出如下:

| 10-09-14 | P1 | xxxx | 
| 11-09-14 | P2 | xxxy | 
| 12-09-14 | P3 | xxyy | 
| 15-09-14 | P1 | xxxx | 
| 16-09-14 | P2 | xxxy | 
| 17-09-14 | P3 | xxyy | 
| 18-09-14 | P1 | xxxx |  
| 19-09-14 | P2 | xxxy | 
| 22-09-14 | P3 | xxxy | 
| 23-09-14 | P1 | xxxx | 
| 24-09-14 | P2 | xxxy | 
| 25-09-14 | P3 | xxyy | 
| 26-09-14 | P1 | xxxx | 
| 29-09-14 | P2 | xxxy | 
| 30-09-14 | P3 | xxyy | 

目前,我可以获取今天的日期并检查它是否是工作日。然后问题就是及时。

4 个答案:

答案 0 :(得分:2)

您可以使用weekday日历,如果返回5或6,您可以将其视为周末。

编辑: 您可以使用datetime执行以下操作:

>>> import datetime
>>> d=datetime.date(2014,9,10)
>>> d.weekday()
2

答案 1 :(得分:1)

您可以简单地使用datetime及其.weekday()函数将星期几映射到0-6,从星期一= 0开始,以星期日= 6结束。

from datetime import datetime

today = datetime.today()  # get todays datetime

if not today.weekday() == 5 or today.weekday == 6:   # if we no weekend-day

    print(datetime.strftime(today,'%d-%m-%y')) # format it to day-month-year

答案 2 :(得分:1)

这应该可以解决问题:

import itertools
from datetime import datetime, timedelta

names = ["P1", "P2", "P3"]
extns = {'P1': 'xxxx', 'P2': 'xxxy', 'P3': 'xxyy'}

for (day,name) in itertools.izip((day for day in (datetime.today()+timedelta(n) for n in itertools.count()) if day.weekday() not in (5,6)), (itertools.cycle(names))):
    print "| %s | %s | %s |" % (day.strftime("%d-%m-%y"), name, extns[name])

从今天开始计数并无限循环。我只假设你想要的是你的原始代码如何结构化。如果你想要它在特定的时间范围内,请告诉我。

<小时/> 编辑:根据评论,这应该只在今天+ 10天打印出来。这可能可以通过多种方式完成,但这样您就可以轻松地编辑您想要的天数,直到今天:

import itertools
from datetime import datetime, timedelta

names = ["P1", "P2", "P3"]
extns = {'P1': 'xxxx', 'P2': 'xxxy', 'P3': 'xxyy'}
days = 11

for (day,name) in itertools.izip((day for day in (datetime.today()+timedelta(n) for n in itertools.count()) if day.weekday() not in (5,6)), (itertools.cycle(names))):    
    if days == 0:
        break

    print "| %s | %s | %s |" % (day.strftime("%d-%m-%Y"), name, extns[name])
    days-= 1

答案 3 :(得分:0)

这可能会给你一些想法。

#! /usr/bin/env python

'''
A generator that returns the dates of consecutive days, skipping weekends
'''

import sys
import datetime

def weekday_gen(current_date):
    day_delta = datetime.timedelta(1)
    while True:
        if current_date.weekday() < 5: 
            yield current_date
        current_date += day_delta


def main():
    if len(sys.argv) > 3:
        d, m, y = [int(s) for s in sys.argv[1:4]]
        start_date = datetime.date(y, m, d)
    else:
        start_date = datetime.date.today()

    weekdays = weekday_gen(start_date)
    for i in xrange(30):
        day = weekdays.next()
        print day, day.strftime('%A')


if __name__ == '__main__':
    main()

但是你如何处理公众假期......