我目前正在为我的工作场所写支持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 |
目前,我可以获取今天的日期并检查它是否是工作日。然后问题就是及时。
答案 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()
但是你如何处理公众假期......