按关键字分组的字典列表,并为每个每月计数的关键字创建每月时间表

问题描述 投票:1回答:1

想象一下,拥有这个词典列表:

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]
python python-3.x group-by grouping timeline
1个回答
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}

如果需要,您可以很容易地用方括号替换大括号。

© www.soinside.com 2019 - 2024. All rights reserved.