Python 使用rrule为相关月份分配天数

Python 使用rrule为相关月份分配天数,python,python-3.x,datetime,python-dateutil,rrule,Python,Python 3.x,Datetime,Python Dateutil,Rrule,我可以使用rrule列出两个日期之间的日期,如下所示: 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.str

我可以使用rrule列出两个日期之间的日期,如下所示:

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

您可以使用
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

如果日期更改为包括小时和分钟。例如,a='09/05/2018 16:54:00'和b='22/06/2018 12:15:00'此方法是否能够准确地将差值作为浮点输出到3 d.p?例如,输出:5月18日:22.30天和6月18日:21.51天?@black.mamba,您必须做更多的工作:您将使用
foo(list(j))
,而不是
len(list(j))
,其中
foo
是一个函数,它获取第一个和最后一个日期,并输出包括时间在内的差值。