Python 过滤日期行的参数化方法
我已经苦苦挣扎了一个星期,我尝试了双向while循环和其他dateutil的东西,但没有运气,每次我的计数器落后或者遇到其他问题 我只是想找到一种最有效的方法,按年度和月份筛选行,以便按月汇总资金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
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似乎更适合这样做,您可以简单地更改更新的返回值,以返回格式化每个对象的月份