Python: преобразование ключей в словаре в день недели, который может повторяться - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть словарь, где ключи и значения являются строками. Ключи выглядят как дата, а значения - как целые числа:

('04 Aug, 2019','1 '),
('26 Apr, 2019','6 '),
...

Таким образом, каждая дата имеет свое значение. Теперь я хочу преобразовать эти даты в день недели и суммировать эти значения для каждого дня. Проблема в том, что когда я использую datetime.strptime для преобразования, мой словарь обрезается из-за повторяющихся ключей. Ключи конвертировались следующим образом:

converted_days = [datetime.strptime(d,"%d %b, %Y").strftime("%A") for d in days]

Это позволяет мне представить эту строку: «04 августа 2019 года» в день недели. Но для более чем 7 ключей некоторые ключи будут повторяться после преобразования. Кроме того, для каждого дня я хочу суммировать значение, например:

monday: 7
monday: 10
friday: 2
sunday: 5
sunday: 3

И вместо коллекции, как указано выше (которую нельзя создать из-за повторяющихся ключей), я хочу получить:

monday: 17
friday: 2
sunday: 8

Кроме того, словарь создается методом dict(zip(x,y), где x - список дат (в виде строк), а y - список целых чисел (в виде строк). Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 26 февраля 2020

Это, вероятно, то, что вам нужно:

from datetime import datetime
from collections import defaultdict

days = [('04 Aug, 2019', '1 '), ('26 Apr, 2019', '6 '), ('19 Apr, 2019', '4 ')]

totals = defaultdict(int)
for date_str, value_str in days:
    totals[datetime.strptime(date_str, "%d %b, %Y").strftime("%A")] += int(value_str)

print(totals)

Результаты:

defaultdict(<class 'int'>, {'Sunday': 1, 'Friday': 10})

Ключевой частью здесь, конечно, является defaultdict, поскольку она позволяет добавлять к ключу, который ранее не был определен. Конечно, вы также можете начать с dict, который имеет значение 0 для каждого возможного ключа в этом случае, поскольку в неделе есть только 7 дней. Но это оставило бы дни, которые никогда не встречаются в наборе данных 0, и вам может потребоваться go очистить их впоследствии, поэтому я бы предпочел defaultdict.

Это использует это решение:

import calendar
from datetime import datetime

days = [('04 Aug, 2019', '1 '), ('26 Apr, 2019', '6 '), ('19 Apr, 2019', '4 ')]

totals = dict(zip(calendar.day_name, [0] * 7))
for date_str, value_str in days:
    totals[datetime.strptime(date_str, "%d %b, %Y").strftime("%A")] += int(value_str)

print(totals)

И результат:

{'Monday': 0, 'Tuesday': 0, 'Wednesday': 0, 'Thursday': 0, 'Friday': 10, 'Saturday': 0, 'Sunday': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...