Python 过滤日期行的参数化方法

Python 过滤日期行的参数化方法,python,database,loops,Python,Database,Loops,我已经苦苦挣扎了一个星期,我尝试了双向while循环和其他dateutil的东西,但没有运气,每次我的计数器落后或者遇到其他问题 我只是想找到一种最有效的方法,按年度和月份筛选行,以便按月汇总资金 fls17 = [counter for counter in db_list if counter.year == 2017] fls18 = [counter.date for counter in db_list if counter.year == 2018] fls19 = [counter

我已经苦苦挣扎了一个星期,我尝试了双向while循环和其他dateutil的东西,但没有运气,每次我的计数器落后或者遇到其他问题

我只是想找到一种最有效的方法,按年度和月份筛选行,以便按月汇总资金

fls17 = [counter for counter in db_list if counter.year == 2017]
fls18 = [counter.date for counter in db_list if counter.year == 2018]
fls19 = [counter.date for counter in db_list if counter.year == 2019]

fls17_sum = sum([counter.money for counter in fls17])
这里是我的数据示例,它已经被解析,转换成datetime对象并放入dataclass

[CsvDateObject(date=datetime.date(2017, 2, 1), year=2017, month=2, day=1, money=71, counter=0),
 CsvDateObject(date=datetime.date(2017, 2, 1), year=2017, month=2, day=1, money=53, counter=1),
 CsvDateObject(date=datetime.date(2017, 2, 25), year=2017, month=2, day=25, money=20, counter=2),
 CsvDateObject(date=datetime.date(2017, 12, 1), year=2017, month=12, day=1, money=35, counter=3),
 CsvDateObject(date=datetime.date(2017, 12, 25), year=2017, month=12, day=25, money=35, counter=4)]

[datetime.date(2018, 1, 1),
 datetime.date(2018, 3, 1),
 datetime.date(2018, 3, 25)]

[datetime.date(2019, 1, 1),
 datetime.date(2019, 6, 1)]

214
问我你是否想看到我以前写的代码的完整列表

++++

这是我的初始数据

csv_list = [
        ['2019-06-1', 68],
        ['2019-01-1', 68],
        ['2018-03-25', 75],
        ['2018-03-1', 75],
        ['2018-01-1', 25],
        ['2017-12-25', 35],
        ['2017-12-1', 35],
        ['2017-02-25', 20],
        ['2017-02-1', 53],
        ['2017-02-1', 71],
]
++++

itertools.groupby()-看起来正是我需要的^_^

gl = list()
for k, v in groupby(db_list, key=lambda i: i.month):
    gl.append(list(v))

当然,如果我理解正确,这就是你想要的:

import datetime
from itertools import groupby
from operator import itemgetter

first = itemgetter(0)
second = itemgetter(1)

updated = [[datetime.datetime.strptime(first(l), '%Y-%m-%d').year, second(l)] for l in csv_list]

[[2019, 68],
 [2019, 68],
 [2018, 75],
 [2018, 75],
 [2018, 25],
 [2017, 35],
 [2017, 35],
 [2017, 20],
 [2017, 53],
 [2017, 71]]

d = {}
for _, g in groupby(updated, key=first):
    grouped = list(g)
    k = first(first(grouped))
    v = sum(second(group) for group in grouped)
    d[k] = v

print(d)

{2017: 214, 2018: 175, 2019: 136}

抱歉,我在这里有点困惑,我没有看到任何
金钱
数据,为什么你不能在数据库中使用
分组方式
进行
求和
?@aws_学徒更新,我没有数据库,仅使用python数据类求和的想法必须按月实现;)但无论如何,非常感谢!我已经深入研究了itertools和functools库,因此如果不了解这些工具,就很难解决我的问题,这些知识已经完成了任务的一半(heh=),但是的,pandas似乎更适合这样做,您可以简单地更改更新的返回值,以返回格式化每个对象的月份