在python词典列表中查找相同日期的单击总数

在python词典列表中查找相同日期的单击总数,python,python-3.x,string,list,dictionary,Python,Python 3.x,String,List,Dictionary,我想找到每个日期的总点击量。我尝试了很多方法,但都没有找到合适的方法。下面我将写下字典的目标列表 data = [{"click":"3","time":"2020-08-21T00:00:00.000Z"}, {"click":"6","time":"2020-08-22T10:00:00.000Z"}, {"

我想找到每个日期的总点击量。我尝试了很多方法,但都没有找到合适的方法。下面我将写下字典的目标列表

data = [{"click":"3","time":"2020-08-21T00:00:00.000Z"},
    {"click":"6","time":"2020-08-22T10:00:00.000Z"},
    {"click":"7","time":"2020-08-22T11:00:00.000Z"},
    {"click":"8","time":"2020-08-22T12:00:00.000Z"},
    {"click":"29","time":"2020-08-24T00:00:00.000Z"},
    {"click":"13","time":"2020-08-25T00:00:00.000Z"}]
在此数据列表中,对于2020-08-22日期,有3个dict具有不同的点击值。所以我想要2020-08-22日期21的总点击量

请帮我得到这样的结果

data = [{"click":"3","time":"2020-08-21T00:00:00.000Z"},
    {"click":"21","time":"2020-08-22T00:00:00.000Z"},
    {"click":"29","time":"2020-08-24T00:00:00.000Z"},
    {"click":"13","time":"2020-08-25T00:00:00.000Z"}]
感谢您的考虑和即将到来的回复。

这里有一个解决方案,使用将日期拆分为
T
&使用日期组件对值进行分组和求和

from itertools import groupby

print([
    {"time": k + "T00:00:00.000Z", "click": sum(int(vv['click']) for vv in v)}
    for k, v in groupby(data, key=lambda x: x['time'].split("T")[0])
])

简单地说就是python:)

输出

[{'click':'3','time':'2020-08-21T00:00:00.000Z'},
{'click':'21','time':'2020-08-22T00:00:00.000Z'},
{'click':'29','time':'2020-08-24T00:00:00.000Z'},
{'click':'13','time':'2020-08-25T00:00:00.000Z'}]

简单解决方案:

total_click_dict = dict()

for d in data:
    # Find first occurrence of 'T' - it separates the date from the rest of the timestamp
    # i.e. 2020-08-22 <- T -> 11:00:00.000Z
    first_index_of_date_seperator = d['time'].find('T')
    # Fetching date
    date = d['time'][0:first_index_of_date_seperator]
    # If date not in dictionary
    if not date in total_click_dict:
        # Create a counter for date
        total_click_dict[date] = 0
    # Increase current date counter by amounts of clicks
    total_click_dict[date] += int(d['click'])

# {'2020-08-21': 3, '2020-08-22': 21, '2020-08-24': 29, '2020-08-25': 13}
print(total_click_dict)
total\u click\u dict=dict()
对于数据中的d:
#查找第一个出现的“T”-它将日期与时间戳的其余部分分开
#即2020-08-22 11:00:00.000Z
日期分隔符的第一个索引=d['time']。查找('T')
#取数日期
日期=d['time'][0:日期分隔符的第一个索引]
#如果日期不在字典中
如果不是总日期,请单击记录:
#为日期创建计数器
总点击次数[日期]=0
#增加当前日期计数器的点击量
总点击次数(日期)+=int(点击次数)
# {'2020-08-21': 3, '2020-08-22': 21, '2020-08-24': 29, '2020-08-25': 13}
打印(总点击次数)
如下

from collections import defaultdict

data = [{"click": "3", "time": "2020-08-21T00:00:00.000Z"},
        {"click": "6", "time": "2020-08-22T10:00:00.000Z"},
        {"click": "7", "time": "2020-08-22T11:00:00.000Z"},
        {"click": "8", "time": "2020-08-22T12:00:00.000Z"},
        {"click": "29", "time": "2020-08-24T00:00:00.000Z"},
        {"click": "13", "time": "2020-08-25T00:00:00.000Z"}]

collected_clicks = defaultdict(int)
collected_clicks_lst = []
for entry in data:
    clicks = int(entry['click'])
    date = entry['time'][:10]
    collected_clicks[date] += clicks
for date,clicks in collected_clicks.items():
    collected_clicks_lst.append({'click': clicks, 'time': date + 'T00:00:00.000Z'})
print(collected_clicks_lst)
输出

[{'click': 3, 'time': '2020-08-21T00:00:00.000Z'}, {'click': 21, 'time': '2020-08-22T00:00:00.000Z'}, {'click': 29, 'time': '2020-08-24T00:00:00.000Z'}, {'click': 13, 'time': '2020-08-25T00:00:00.000Z'}]

返回所需格式的简单解决方案

new_map = {}
result = []
for entry in data:
    time = entry.get('time').split('T')[0]
    click = int(entry.get('click'))
    if time+"T00:00:00.000Z" not in new_map:
        new_map[time+"T00:00:00.000Z"] = click
    else:
        new_map[time+"T00:00:00.000Z"] += click
for entry in new_map:
    result.append({"click":str(new_map.get(entry)), "time":entry})

额外的
导入
是为了避免重新发明轮子(重新编写冗余代码)
[{'click': 3, 'time': '2020-08-21T00:00:00.000Z'}, {'click': 21, 'time': '2020-08-22T00:00:00.000Z'}, {'click': 29, 'time': '2020-08-24T00:00:00.000Z'}, {'click': 13, 'time': '2020-08-25T00:00:00.000Z'}]
new_map = {}
result = []
for entry in data:
    time = entry.get('time').split('T')[0]
    click = int(entry.get('click'))
    if time+"T00:00:00.000Z" not in new_map:
        new_map[time+"T00:00:00.000Z"] = click
    else:
        new_map[time+"T00:00:00.000Z"] += click
for entry in new_map:
    result.append({"click":str(new_map.get(entry)), "time":entry})