简体   繁体   English

Python如何根据日期创建子列表?

[英]Python how create sublists based by date?

I'm have a list like this: 我有一个这样的清单:

my = [datetime.datetime(2013, 11, 12, 20, 22, 5),
     datetime.datetime(2013, 11, 12, 20, 21, 27),
     datetime.datetime(2013, 11, 12, 20, 20, 28),
     datetime.datetime(2013, 11, 11, 18, 21, 27),
     datetime.datetime(2013, 11, 11, 15, 21, 27),
     datetime.datetime(2013, 11, 11, 11, 21, 27),
     datetime.datetime(2013, 11, 10, 9, 21, 27),
     datetime.datetime(2013, 11, 10, 19, 21, 27),
     datetime.datetime(2013, 11, 10, 22, 21, 27),
     datetime.datetime(2013, 11, 10, 20, 21, 27)]

And I want create lists by day into another list, I'm using a[n].date() to compare dates and join them, but I'm running in circles whithout get it, please could someone help me? 我想按天将列表创建到另一个列表中,我正在使用a [n] .date()比较日期并将其加入,但是我却无所事事地在圈子里奔跑,请有人帮帮我吗?

Result expected: 预期结果:

    days = [
    [datetime.datetime(2013, 11, 12, 20, 22, 5), datetime.datetime(2013, 11, 12, 20, 21, 27), datetime.datetime(2013, 11, 12, 20, 20, 28)],
    [datetime.datetime(2013, 11, 11, 18, 21, 27),datetime.datetime(2013, 11, 11, 15, 21, 27),datetime.datetime(2013, 11, 11, 11, 21, 27)],
    [datetime.datetime(2013, 11, 10, 9, 21, 27),datetime.datetime(2013, 11, 10, 19, 21, 27),datetime.datetime(2013, 11, 10, 22, 21, 27),datetime.datetime(2013, 11, 10, 20, 21, 27)]
           ]

Attempt failed: 尝试失败:

In [152]: fecha = None
   .....: dia = []
   .....: days = []
   .....: for i in my:
   .....:     if fecha:
   .....:         if i.date() == fecha:
   .....:             dia.append(i)
   .....:         else:
   .....:             days.append(dia)
   .....:             fecha = i.date()
   .....:     else:
   .....:         fecha = i.date()

Thanks 谢谢

Use itertools.groupby and group using key = datetime.date() : 使用itertools.groupby并使用key = datetime.date()分组:

.date() on a datetime object return date object, we can use this to group the items of the list: .date()datetime对象返回date对象上,我们可以使用它来对列表项进行分组:

>>> my[0].date()
datetime.date(2013, 11, 12)

Demo: 演示:

>>> from pprint import pprint
>>> from itertools import groupby
>>> pprint([list(g) for k, g in groupby(my, key=lambda x:x.date())])
[[datetime.datetime(2013, 11, 12, 20, 22, 5),
  datetime.datetime(2013, 11, 12, 20, 21, 27),
  datetime.datetime(2013, 11, 12, 20, 20, 28)],
 [datetime.datetime(2013, 11, 11, 18, 21, 27),
  datetime.datetime(2013, 11, 11, 15, 21, 27),
  datetime.datetime(2013, 11, 11, 11, 21, 27)],
 [datetime.datetime(2013, 11, 10, 9, 21, 27),
  datetime.datetime(2013, 11, 10, 19, 21, 27),
  datetime.datetime(2013, 11, 10, 22, 21, 27),
  datetime.datetime(2013, 11, 10, 20, 21, 27)]]

If keys are not already sorted by dates then use a collections.defaultdict(list) and use datetime.date() as key. 如果键尚未按日期排序,则使用collections.defaultdict(list)并使用datetime.date()作为键。

Okay Goku, let me show you how to use itertools.groupby . 好的,悟空,让我向您展示如何使用itertools.groupby Here: 这里:

for date, group in itertools.groupby(my, lambda x: x.day):
    new_list.append(list(group))

Or list comprehension: 或列表理解:

new_list = [list(group) for day, group in itertools.groupby(my, lambda x: x.day)]

Demo: 演示:

>>> import itertools
>>> new_list = []
>>> for date, group in itertools.groupby(my, lambda x: x.day):
    new_list.append(list(group))


>>> new_list
[[datetime.datetime(2013, 11, 12, 20, 22, 5), datetime.datetime(2013, 11, 12, 20, 21, 27), datetime.datetime(2013, 11, 12, 20, 20, 28)], [datetime.datetime(2013, 11, 11, 18, 21, 27), datetime.datetime(2013, 11, 11, 15, 21, 27), datetime.datetime(2013, 11, 11, 11, 21, 27)], [datetime.datetime(2013, 11, 10, 9, 21, 27), datetime.datetime(2013, 11, 10, 19, 21, 27), datetime.datetime(2013, 11, 10, 22, 21, 27), datetime.datetime(2013, 11, 10, 20, 21, 27)]]
>>> 

Edit: Sorry, i thought you were grouping it by day. 编辑:对不起,我以为你是按天分组的。 If you want to group it by date, do this: 如果要按日期分组,请执行以下操作:

for date, group in itertools.groupby(my, lambda x: x.date()):
    new_list.append(list(group))

Good luck! 祝好运!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM