【问题标题】:Using rrule to assign days to relevant months使用 rrule 将日期分配给相关月份
【发布时间】:2018-06-10 18:52:25
【问题描述】:

我可以像这样使用 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

【问题讨论】:

    标签: python python-3.x datetime python-dateutil rrule


    【解决方案1】:

    您可以使用itertools.groupby 并提取每个组的长度。在下面的示例中,grouperres 都是惰性迭代器,因此您可以通过迭代提取结果。

    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,你必须做更多的工作:而不是len(list(j)),你会得到foo(list(j)),其中foo是一个函数,它接受第一个和最后一个日期并输出包括时间在内的差异。
    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多