【问题标题】:Generating recurring dates using python?使用python生成重复日期?
【发布时间】:2011-01-18 17:46:49
【问题描述】:

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

【问题讨论】:

  • 到目前为止你写了什么代码?请贴出你写的代码。

标签: python date


【解决方案1】:
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']

【讨论】:

【解决方案2】:

你可以试试dateutil——尤其是它的 relativedelta 和 rrule 特征。

【讨论】:

  • 我使用以下代码: print list(rrule(DAILY, count=10,dtstart=parse("19/02/2010"))) 输出如下: [datetime.datetime (2010, 2, 19, 0, 0), datetime.datetime(2010, 2, 20, 0, 0), datetime.datetime(2010, 2, 21, 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, 27, 0, 0), datetime.datetime(2010, 2, 28, 0, 0)] 但我想要输出如下: 19/02/2010 20/02/2010 21/02/2010 。 . .可以改吗?
  • 能否编辑问题以包含此代码以便阅读?
  • @nimmyliji:所以你问的不是重复日期,而是日期格式。
  • 没有。不是那样......我想知道重复日期以及日期格式。你告诉我尝试使用 dateutil 模块.....之后我才尝试使用 dateutil
  • 所以请用 dateutil 问题更新问题并相应地更新标签。
【解决方案3】:

您可以尝试自己编写。您首先需要一个迭代器,它生成按给定间隔分隔的日期:

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 模块的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2020-12-24
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2016-04-02
    相关资源
    最近更新 更多