需要一些Python日期时间魔术

kov*_*nin 2 python datetime

大家好.我不认为这应该是非常复杂但我无法得到它.我有一个datetime从某个日期开始到一个结束的对象列表.有些日子可以跳过.我可以像这样打印出来:

for entry in dates:
    print entry
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出:

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
Run Code Online (Sandbox Code Playgroud)

我想做的是得到这样的输出:

Day 1: ok
Day 2: ok
Day 3: skipped
Day 4: ok
...
Day 10: ok
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决一些常识吗?

谢谢!

Bre*_*wey 9

这是通过将datetimes 转换为dates 来实现此目的的方法.我们不是尝试迭代日期本身,而是考虑timedelta最后一个日期和第一个日期(这需要对日期进行排序,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)
Run Code Online (Sandbox Code Playgroud)

输出:

Day 1: ok
Day 2: ok
Day 3: skipped
Day 4: skipped
Day 5: skipped
Day 6: ok
Run Code Online (Sandbox Code Playgroud)

注意:我在这里创建了自己的示例,因为我不确定您使用的示例是否有意义.


Chr*_*vey 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)
Run Code Online (Sandbox Code Playgroud)