两个日期之间特定月份/工作日的数量

ims*_*msc 0 python time datetime

如何获得两个日期之间特定月份和工作日的数量.

如果日期是

datetime.datetime(2004, 01, 01)
datetime.datetime(2005, 10, 01)
Run Code Online (Sandbox Code Playgroud)

我希望我的输出为

{'January':2, 'February':2, ..., 'December':1}
{'Monday':xx, ..., 'Sunday':xx}
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 5

在Python 2.7中:

from datetime import datetime
from dateutil import rrule
import itertools as it
from collections import Counter

rule = rrule.rrule(rrule.DAILY,
                   dtstart=datetime(2004, 01, 01),
                   until=datetime(2005, 10, 01))

dict(Counter(d.strftime('%A') for d in rule))
# {'Friday': 92,
#  'Monday': 91,
#  'Saturday': 92,
#  'Sunday': 91,
#  'Thursday': 92,
#  'Tuesday': 91,
#  'Wednesday': 91}

dict(Counter(k for k,v in it.groupby(d.strftime('%B') for d in rule)))
# or
dict(Counter(k for k,v in it.groupby(rule, key=lambda x: x.strftime('%B'))))

# {'April': 2,
#  'August': 2,
#  'December': 1,
#  'February': 2,
#  'January': 2,
#  'July': 2,
#  'June': 2,
#  'March': 2,
#  'May': 2,
#  'November': 1,
#  'October': 2,
#  'September': 2}
Run Code Online (Sandbox Code Playgroud)

正如@ thg435正确评论,dateutil不在标准的Python库中.但是,它可以替换为以下命令:

dtstart = datetime(2004, 01, 01)
until = datetime(2005, 10, 01)
rule = [dtstart + timedelta(i) for i in xrange((until - dtstart).days + 1)]
Run Code Online (Sandbox Code Playgroud)

  • 创意!值得指出的是,dateutil是非标准的(在这种情况下可以很容易地用timedelta替换). (2认同)