想象一下,拥有这个词典列表:
lst = [{'id': 1, 'upload_date': '05-01-2019'}, {'id': 1, 'upload_date': '06-01-2019'}, {'id': 1, 'upload_date': '08-02-2020'}, {'id': 2, 'upload_date': '08-04-2019'}, {'id': 3, 'upload_date': '06-01-2019'}]
字典输出列表:
[{'id': 1, 'upload_date': '05-01-2019'},
{'id': 3, 'upload_date': '06-02-2019'},
{'id': 1, 'upload_date': '06-01-2019'},
{'id': 1, 'upload_date': '08-02-2020'},
{'id': 2, 'upload_date': '08-04-2019'}]
我想按ID对字典列表进行分组,然后为每个ID创建一个在2019年1月1日至2020年3月之间的时间轴。然后,对于该时间轴中的每个月,我要计算该月发生了多少次。
到目前为止,我设法在两个日期之间创建了每月时间表:
timeline = pd.date_range('01-01-2019','03-01-2020', freq='MS').strftime("%m-%Y").tolist()
输出时间轴:
['01-2019', '02-2019', '03-2019', '04-2019', '05-2019', '06-2019', '07-2019', '08-2019', '09-2019', '10-2019', '11-2019', '12-2019', '01-2020', '02-2020', '03-2020']
因此,所需的输出应类似于:
1 : ['01-2019': 2, '02-2019': '0', '03-2019': 0, '04-2019': 0, ......... ,'02-2020': 1]
2 : ['01-2019': 0, '02-2019': '0', '03-2019': 0, '04-2019': 1, ......... ,'02-2020': 0]
3 : ['01-2019': 0, '02-2019': '1', '03-2019': 0, '04-2019': 0, ......... ,'02-2020': 0]
更新:我意识到您正在寻找MM-YYYY计数,而不是MM-DD-YYYY,下面的代码应该可以正常工作。现在,使用datetime解析日期,并将设置的理解向下移动到大嵌套中。
这不是很漂亮,但是可以完成工作。我保证有更多的Python方式可以实现这一目标。
from datetime import datetime
lst = [
{'id': 1, 'upload_date': '05-01-2019'},
{'id': 3, 'upload_date': '06-02-2019'},
{'id': 1, 'upload_date': '06-01-2019'},
{'id': 1, 'upload_date': '08-02-2020'},
{'id': 2, 'upload_date': '08-04-2019'},
]
# Remove day from lst dates
lst = [
{
"id": i["id"],
"upload_date": f'{datetime.strptime(i["upload_date"], "%m-%d-%Y"):%m-%Y}',
}
for i in lst
]
# Four layer comprehension
# - id_dates = {i: {dictcomp} for i in {setcomp}}
# - {dictcomp} = {date: [listcomp].count(date) if same ID}
# - [listcomp] = [date for date in list if same ID]
# - {setcomp} = {id for id in list}
id_dates = {
i: {
dct["upload_date"]: [d["upload_date"] for d in lst if d["id"] == i].count(
dct["upload_date"]
)
for dct in lst
if dct["id"] == i
}
for i in {i["id"] for i in lst}
}
for _id, counts in id_dates.items():
print(f"{_id}: {counts}")
输出
1: {'05-2019': 1, '06-2019': 1, '08-2020': 1}
2: {'08-2019': 1}
3: {'06-2019': 1}
如果需要,您可以很容易地用方括号替换大括号。