[英]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.