4

開始日と終了日を指定して、平日のみの日付オブジェクトのリストを作成する最もクリーンで Pythonic な方法を考えようとしています。これは私が思いつくことができるものです:

sdate = datetime.date(2013, 9, 1)
edate = datetime.date(2013, 9, 30)
weekdays = [sdate + datetime.timedelta(days=i) 
            for i in range((edate - sdate).days+1) 
            if (sdate + datetime.timedelta(days=i)).weekday() not in (5, 6)]

また

alldays = (sdate + datetime.timedelta(days=i) for i in range((edate - sdate).days+1))
weekdays = [d for d in alldays if d.weekday() not in (5, 6)]

このようなものはクリーンと見なされますか、それとも私はばかげているだけで、それを吸い上げて for ループを作成する必要がありますか?

4

3 に答える 3

2

( dateutil.rrule) pip install python-dateutil:

import datetime
from dateutil import rrule

start = datetime.datetime(2013, 9, 1)
end = datetime.datetime(2013, 9, 30)
rule = rrule.rrule(dtstart=start, freq=rrule.DAILY,
    byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR]
)
rule.between(start, end, inc=True)


[datetime.datetime(2013, 9, 2, 0, 0),
 datetime.datetime(2013, 9, 3, 0, 0),
 datetime.datetime(2013, 9, 4, 0, 0),
 datetime.datetime(2013, 9, 5, 0, 0),
 datetime.datetime(2013, 9, 6, 0, 0),
 datetime.datetime(2013, 9, 9, 0, 0),
 datetime.datetime(2013, 9, 10, 0, 0),
 datetime.datetime(2013, 9, 11, 0, 0),
 datetime.datetime(2013, 9, 12, 0, 0),
 datetime.datetime(2013, 9, 13, 0, 0),
 datetime.datetime(2013, 9, 16, 0, 0),
 datetime.datetime(2013, 9, 17, 0, 0),
 datetime.datetime(2013, 9, 18, 0, 0),
 datetime.datetime(2013, 9, 19, 0, 0),
 datetime.datetime(2013, 9, 20, 0, 0),
 datetime.datetime(2013, 9, 23, 0, 0),
 datetime.datetime(2013, 9, 24, 0, 0),
 datetime.datetime(2013, 9, 25, 0, 0),
 datetime.datetime(2013, 9, 26, 0, 0),
 datetime.datetime(2013, 9, 27, 0, 0),
 datetime.datetime(2013, 9, 30, 0, 0)]
于 2013-10-03T19:20:35.040 に答える
1

これが必ずしもあなたのアプローチよりも Pythonic であると言っているわけではありませんが、ジェネレーターとを組み合わせることで、オーバーヘッドを追加することなくコードを読みやすくすることができます。これも YMMV です。

from itertools import takewhile, count
import datetime
sdate = datetime.date(2013, 9, 1)
edate = datetime.date(2013, 9, 30)
g = (sdate + datetime.timedelta(days=x) for x in count(1))
g = (x for x in g if x.weekday() not in (5, 6))
g = takewhile(lambda x: x <= edate, g)
print list(g)
于 2013-10-03T19:44:51.950 に答える