2010-02-19 180 views
16

如何使用Python生成重复日期?例如,我想生成“每隔一个月的第三个星期五”的重复日期。我想要生成每日,每周,每月,每年的重复日期(即与Outlook Express中的重现功能相同)。使用python生成重复日期?

+1

到目前为止你写了什么代码?请发布你写的代码。 – 2010-02-19 11:06:24

回答

24
import dateutil.rrule as dr 
import dateutil.parser as dp 
import dateutil.relativedelta as drel 

start=dp.parse("19/02/2010") # Third Friday in Feb 2010 

这会产生第三个星期五每月

rr = dr.rrule(dr.MONTHLY,byweekday=drel.FR(3),dtstart=start, count=10) 

这将打印的每月第三个星期五:

print map(str,rr) 
# ['2010-02-19 00:00:00', '2010-03-19 00:00:00', '2010-04-16 00:00:00', '2010-05-21 00:00:00', '2010-06-18 00:00:00', '2010-07-16 00:00:00', '2010-08-20 00:00:00', '2010-09-17 00:00:00', '2010-10-15 00:00:00', '2010-11-19 00:00:00'] 

RR是一个迭代的,所以你可以用切片的符号来挑选出每其他项目。这将打印每隔一个月的第三个星期五

print map(str,rr[::2]) 
# ['2010-02-19 00:00:00', '2010-04-16 00:00:00', '2010-06-18 00:00:00', '2010-08-20 00:00:00', '2010-10-15 00:00:00'] 

以上,我以前str美化输出一点点。要获得更灵活的日期字符串格式,请使用strftime:请参阅http://au2.php.net/strftime或针对所有选项的strftime手册页。

print [d.strftime('%d/%m/%Y') for d in rr[::2]] 
# ['19/02/2010', '16/04/2010', '18/06/2010', '20/08/2010', '15/10/2010'] 
+0

+1因为我无耻地使用你的优秀例子来回答这个非常相似的SO问题:http://stackoverflow.com/questions/3099007/date-library-capable-of-calculating-things-like-every-third-tuesday – bernie 2010-06-23 05:20:49

0

你可以试一试dateutil - 尤其是它的相对性和鲁棒性。

+0

我使用下面的代码: 打印列表(RRULE(每天,数= 10,为dtstart =解析( “19/02/2010”))) 的出来说就是看起来像: [datetime.datetime( (2010,2,2,0,0,0),datetime.datetime(2010,2,20,0,0),datetime.datetime(2010,2,2,0,0),datetime.datetime(2010,2,22 ,0,0),datetime.datetime(2010,2,23,0,0),datetime.datetime(2010,2,24,0,0),datetime.datetime(2010,2,25,0,0) ,datetime.datetime(2010,2,26,0,0),datetime.datetime(2010,2,2,0,0,0),datetime.datetime(2010,2,28,0,0)] 但是我想要输出如: 19/02/2010 20/02/2010 21/02/2010 。 。 。 可以更改吗? – Nimmy 2010-02-19 11:38:14

+0

可以编辑问题以包含此代码,以便它可以被读取? – pwdyson 2010-02-19 12:01:30

+0

@nimmyliji:所以你不问关于重复日期,而是关于日期格式。 – 2010-02-19 12:10:28

0

你可能会尝试自己写这个。你首先需要产生一个给定的间隔隔开日期迭代器:

import datetime 

def dateiter(start, resolution): 
    date = start 
    while True: 
      yield date 
      date += resolution 

现在,您可以生成日期和它们进行过滤:

# generate a list of every tuesday of february 
# this iterates over every day from now, and filtered according to the rules 
# warning: infinite generator below, there is nothing to end the iteration 
tuesdays_of_february = (date for date in dateiter(datetime.datetime.now(), datetime.timedelta(days=1)) if date.weekday() == 4 and date.month == 2) 

你可以自己调用迭代,直到你有足够的日期:

>>> next(tuesdays_of_february) 
datetime.datetime(2010, 2, 19, 14, 25, 46, 171000) 

现在,你需要限制的结果:

>>> from itertools import * 
>>> 
>>> # get the five next valid dates: 
>>> list(islice(tuesdays_of_february),5) 
[datetime.datetime(2010, 2,26, 14, 25, 46, 171000), datetime.datetime(2011, 2, 4 
, 14, 25, 46, 171000), datetime.datetime(2011, 2, 11, 14, 25, 46, 171000), datet 
ime.datetime(2011, 2, 18, 1 4, 25, 46, 171000), datetime.datetime(2011, 2, 25 
, 14, 25, 46, 171000)] 
>>> 
>>> # or until a condition is met: 
>>> list(takewhile(lambda date: date.year < 2014, tuesdays_of_february)) 
[datetime.datetime(2012, 2, 3, 14, 25, 46, 171000), datetime.datetime(2012, 2, 1 
0, 14, 25, 46, 171000), datetime.datetime(2012, 2, 17, 14, 25, 46, 171000), date 
time.datetime(2012, 2, 24, 14, 25, 46, 171000), datetime.datetime(2013, 2, 1, 14 
, 25, 46, 171000), datetime.datetime(2013, 2, 8, 14, 25, 46, 171000), datetime.d 
atetime(2013, 2, 15, 14, 25, 46, 171000), datetime.datetime(2013, 2, 22, 14, 25, 
46, 171000)] 

不要忘记查看datetime模块的文档。