需要一些Python日期时间的魔法

2 投票
2 回答
772 浏览
提问于 2025-04-16 08:21

大家好。我觉得这个问题应该不复杂,但我就是搞不定。我有一个从某个日期开始到另一个日期结束的datetime对象列表。有些天可以跳过。我可以这样打印出来:

for entry in dates:
    print entry

这样会得到以下输出:

2010-11-29 10:00:00.0
2010-12-30 10:00:00.0 
2010-12-01 10:00:00.0 # Note that December 3rd has been skipped
...
2010-12-07 10:00:00.0

我想要的输出是这样的:

Day 1: ok
Day 2: ok
Day 3: skipped
Day 4: ok
...
Day 10: ok

有没有人能给我点建议呢?

谢谢!

2 个回答

5

使用来自dateutil包的“rrule”模块,您可以在这个链接找到它:http://labix.org/python-dateutil

import datetime
from dateutil import rrule

dates = (datetime.datetime(2010, 11, 29),
         datetime.datetime(2010, 11, 30),
         datetime.datetime(2010, 12, 2))

all_dates = list(rrule.rrule(rrule.DAILY, count=5, 
                 dtstart=datetime.datetime(2010, 11,29)))

for (i, date) in enumerate(all_dates):
    if date in dates:
        status = "ok"
    else:
        status = "skipped"

    print "Day %s: %s" % (i+1, status)
9

这里有一种方法,可以通过把你的 datetime 转换成 date 来实现这个功能。我们不是直接遍历每一个日期,而是计算最后一个日期和第一个日期之间的时间差(这要求你的日期是排好序的,如果没有排序,我加了一个 sorted 的调用来处理)。然后,我们检查从第一个日期开始,加上每一天的天数,是否在你原来的日期集合中:

from datetime import datetime, timedelta
dts = [datetime(2010, 11, 29, 10, 0, 0), datetime(2010, 11, 30, 10, 0, 0),
       datetime(2010, 12, 4, 10, 0, 0)]
dates = sorted(d.date() for d in dts)

for d in range((dates[-1] - dates[0]).days + 1):
    st = 'ok' if dates[0] + timedelta(days=d) in dates else 'skipped'
    print 'Day %d: %s' % (d + 1, st)

输出结果:

Day 1: ok
Day 2: ok
Day 3: skipped
Day 4: skipped
Day 5: skipped
Day 6: ok

注意:我在这里创建了自己的例子,因为我不确定你用的例子是否真的有意义。

撰写回答