Использование правила для назначения дней соответствующим месяцам - PullRequest
0 голосов
/ 10 июня 2018

Мне удалось перечислить дни между двумя датами, используя правило:

from dateutil import rrule
from datetime import datetime

a = '20180306'
b = '20180506'

for dt in rrule.rrule(rrule.DAILY,
                  dtstart = datetime.strptime(a, '%Y%m%d'),
                  until = datetime.strptime(b, '%Y%m%d')):
    print (dt.strftime('%Y%m%d'))

получено:

20180306
20180307
...
20180408
20180409
...
20180506

Как можно назначить эти дниих соответствующие месяцы дают вывод:

March-18: 26 days
April-18: 30 days
May-18: 6 days

Мне также любопытно, как расширить это, чтобы включить часы в расчет, т.е.

March-18: 11.9 days

Спасибо black.mamba

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать itertools.groupby и извлечь длину каждой группы.В приведенном ниже примере и grouper, и res являются ленивыми итераторами, поэтому вы можете извлекать результаты путем итерации.

from dateutil import rrule
from datetime import datetime
from itertools import groupby

a = '20180306'
b = '20180506'

rule = rrule.rrule(rrule.DAILY,
                   dtstart=datetime.strptime(a, '%Y%m%d'),
                   until=datetime.strptime(b, '%Y%m%d'))

grouper = groupby(rule, key=lambda x: x.strftime('%B-%y'))

res = ((i, len(list(j))) for i, j in grouper)

for month, count in res:
    print('{0}: {1} days'.format(month, count))

March-18: 26 days
April-18: 30 days
May-18: 6 days
...