【问题标题】:Split list of datetime by hours using python使用python按小时拆分日期时间列表
【发布时间】:2014-12-21 11:01:42
【问题描述】:

例如,我正在寻找按小时拆分日期时间实例列表的方法。例如:

list_of_dts = [
    datetime.datetime(2012,1,1,0,0,0),
    datetime.datetime(2012,1,1,0,1,0),
    datetime.datetime(2012,1,1,1,8,0),
    datetime.datetime(2012,1,2,0,5,0),
    datetime.datetime(2012,1,2,1,4,0),
]

会生成

[[datetime.datetime(2012,1,1,0,0,0), datetime.datetime(2012,1,1,0,1,0), 
  datetime.datetime(2012,1,2,0,5,0)], 
 [datetime.datetime(2012,1,1,1,8,0), datetime.datetime(2012,1,2,1,4,0)]]

我知道您可以通过将每一天量化为序数来按天拆分日期时间,但我找不到可以按小时量化日期时间的函数

[list(group) for k, group in itertools.groupby(list_of_dts,
                                               key=datetime.datetime.toordinal)]

【问题讨论】:

    标签: python datetime split


    【解决方案1】:

    只需提取要分组的方面;如果您想按小时分组,则需要提取一个属性:

    from itertools import groupby
    
    [list(g) for k, g in groupby(list_of_dts, key=lambda d: d.hour)]
    

    或使用operator.attrgetter() 代替 lambda:

    from itertools import groupby
    from operator import attrgetter
    
    [list(g) for k, g in groupby(list_of_dts, key=attrgetter('hour'))]
    

    请注意groupby() 不会排序;它只会产生具有相同分组键的连续值组。

    如果您需要对 未排序 值进行分组,那么最好在字典中进行分组:

    grouped = {}
    
    for dt in list_of_dts:
        grouped.setdefault(dt.hour, []).append(dt)
    
    result = grouped.values()
    

    或者,按小时对输出进行排序:

    result = [grouped[hour] for hour in sorted(grouped)]
    

    演示:

    >>> import datetime
    >>> from itertools import groupby
    >>> from operator import attrgetter
    >>> list_of_dts = [
    ...     datetime.datetime(2012,1,1,0,0,0),
    ...     datetime.datetime(2012,1,1,0,1,0),
    ...     datetime.datetime(2012,1,1,1,8,0),
    ...     datetime.datetime(2012,1,2,0,5,0),
    ...     datetime.datetime(2012,1,2,1,4,0),
    ... ]
    >>> [list(g) for k, g in groupby(list_of_dts, key=attrgetter('hour'))]
    [[datetime.datetime(2012, 1, 1, 0, 0), datetime.datetime(2012, 1, 1, 0, 1)], [datetime.datetime(2012, 1, 1, 1, 8)], [datetime.datetime(2012, 1, 2, 0, 5)], [datetime.datetime(2012, 1, 2, 1, 4)]]
    >>> grouped = {}
    >>> for dt in list_of_dts:
    ...     grouped.setdefault(dt.hour, []).append(dt)
    ... 
    >>> [grouped[hour] for hour in sorted(grouped)]
    [[datetime.datetime(2012, 1, 1, 0, 0), datetime.datetime(2012, 1, 1, 0, 1), datetime.datetime(2012, 1, 2, 0, 5)], [datetime.datetime(2012, 1, 1, 1, 8), datetime.datetime(2012, 1, 2, 1, 4)]]
    >>> from pprint import pprint
    >>> pprint(_)
    [[datetime.datetime(2012, 1, 1, 0, 0),
      datetime.datetime(2012, 1, 1, 0, 1),
      datetime.datetime(2012, 1, 2, 0, 5)],
     [datetime.datetime(2012, 1, 1, 1, 8), datetime.datetime(2012, 1, 2, 1, 4)]]
    

    【讨论】:

    • 我认为第一种方法可以按日期和时间分开,但第二种方法有效。
    • @Kevin:不,如答案中所述,groupby 仅适用于连续值。所以第一组有一个匹配的小时,然后因为时间改变而产生一个新组,然后因为小时再次改变而产生另一个组,等等。对于groupby,在两组中使用相同的小时值无关紧要,组未排序。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多