在python中按年份分组和按月份分组

时间:2018-09-10 08:11:44

标签: python-3.x list arraylist grouping

假设我有一个这样的列表:

list = [["A",datetime.datetime(1985,8,31,0,0)], ["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)],["D",datetime.datetime(2014,6,9,0,0)], ["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]

如何最优雅地按年份将其分组,按月将子组分组,以在Python中获得此列表输出,例如:

newlist = [["A",datetime.datetime(1985,8,31,0,0)], [[["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)]],["D",datetime.datetime(2014,6,9,0,0)]], [["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]]

因此,该值按年份分组,而不是按月分组,并且保留了顺序 我正在代码中导入datetime模块

import datetime

并应用strptime

kdate=year/month/day
date = datetime.datetime.strptime(kdate , "%m/%d/%Y")

比起我将日期保存在列表中。列表显示在上方

1 个答案:

答案 0 :(得分:0)

通过使用 itertools.groupby ,您可以按年份分组,然后按月份分组。

表达式有点复杂,需要在应用任何groupby表达式之前对初始列表进行排序,但是它可以得到不错的结果。

newlist = [[list(subgroup) for _, subgroup in groupby(group, key=lambda i: i[1].strftime("%m"))] for _, group in groupby(sorted(mylist, key=lambda i: i[1].strftime("%Y%m%d")), key=lambda i: i[1].strftime("%Y"))]

使用格式CCYYMMDD按年,月和日对初始列表进行排序。 然后将排序列表按年份分组。 结果列表最终按月分组。

这将返回一个三级列表,其中包括:

  • 子列表枚举了初始列表中每个不同的年份。
  • 年份子列表由枚举相对于年份的每个不同月份的子列表组成。
  • 月份子列表最终由相对于月份和年份的组组成。这些最低的子列表按升序排序。

这是从您的列表中得到的结果:

[[[['A', datetime.datetime(1985, 8, 31, 0, 0)]]], [[['B', datetime.datetime(2014, 4, 3, 0, 0)], ['C', datetime.datetime(2014, 4, 4, 0, 0)]], [['D', datetime.datetime(2014, 6, 9, 0, 0)]]], [[['F', datetime.datetime(2015, 2, 7, 0, 0)]], [['E', datetime.datetime(2015, 6, 1, 0, 0)]]]]

这并不是您所期望的。但是这种结构的好处在于,它尊重嵌套在月份中的天和嵌套在年份中的月的层次结构。可以轻松地将其用作循环结构的输入(例如)。

for year in newlist:
    for month in year:
        for day in month:
            # some code here.

希望它可以提供帮助。