Я не уверен, возможно ли это, но у меня есть очень большой массив, содержащий даты
a = ['Fri, 19 Aug 2011 19:28:17 -0000',....., 'Wed, 05 Feb 2012 11:00:00 -0000']
Я пытаюсь найти способ подсчитать частоту дней и месяцев в массиве. В этом случае я пытаюсь подсчитать строки для сокращений месяцев или дней (например, пт, пн, апр, июль)
Нет, даты не обязательно должны быть в одном формате. Также мне нужны дни и месяцы.






Вы можете использовать Прилавок() из модуля коллекций.
from collections import Counter
a = ['Fri, 19 Aug 2011 19:28:17 -0000',
'Fri, 09 June 2017 11:11:11 -0000',
'Wed, 05 Feb 2012 11:00:00 -0000']
# this generator splits the dates into words, and cleans word from "".,;-:" characters:
# ['Fri', '19', 'Aug', '2011', '19:28:17', '0000', 'Fri', '09', 'June',
# '2017', '11:11:11', '0000', 'Wed', '05', 'Feb', '2012', '11:00:00', '0000']
# and feeds it to counting:
c = Counter( (x.strip().strip(".,;-:") for word in a for x in word.split() ))
for key in c:
if key.isalpha():
print(key, c[key])
if печатает только те ключи счетчика, которые являются чистыми «буквами», а не цифрами:
Fri 2
Aug 1
June 1
Wed 1
Feb 1
Названия дней и месяцев - единственные чистые части isalpha() ваших дат.
Полный вывод c:
Counter({'0000': 3, 'Fri': 2, '19': 1, 'Aug': 1, '2011': 1,
'19:28:17': 1, '09': 1, 'June': 1, '2017': 1, '11:11:11': 1,
'Wed': 1, '05': 1, 'Feb': 1, '2012': 1, '11:00:00': 1})
Улучшение от @AzatIbrakov комментарий:
c = Counter( (x.strip().strip(".,;-:") for word in a for x in word.split()
if x.strip().strip(".,;-:").isalpha()))
отсеял бы не-альфа-слова уже на этапе генерации.
Спасибо. Не только предоставил чистый и быстрый метод для моей основной цели, но также предоставил мне средства для поиска другой счетной информации о датах в моем массиве.
@ user1821176 другим подходящим способом было бы использовать регулярное выражение, но для этого необходимо исправить формат дат. рад, что это помогает.
Python имеет встроенный метод .count, который здесь очень полезен:
lista = [
'Fri, 19 Aug 2011 19:28:17 -0000',
'Fri, 19 Aug 2011 19:28:17 -0000',
'Sun, 19 Jan 2011 19:28:17 -0000',
'Sun, 19 Aug 2011 19:28:17 -0000',
'Fri, 19 Jan 2011 19:28:17 -0000',
'Mon, 05 Feb 2012 11:00:00 -0000',
'Mon, 05 Nov 2012 11:00:00 -0000',
'Wed, 05 Feb 2012 11:00:00 -0000',
'Tue, 05 Nov 2012 11:00:00 -0000',
'Tue, 05 Dec 2012 11:00:00 -0000',
'Wed, 05 Jan 2012 11:00:00 -0000',
]
listb = (''.join(lista)).split()
for index, item in enumerate(listb):
count = {}
for item in listb:
count[item] = listb.count(item)
months = ['Jan', 'Feb', 'Aug', 'Nov', 'Dec']
for k in count:
if k in months:
print(f"{k}: {count[k]}")
Выход:
(xenial)vash@localhost:~/python/stack_overflow$ python3.7 count_months.py Aug: 3 Jan: 3 Feb: 2 Nov: 2 Dec: 1
Происходит то, что мы берем все items из lista и их join в один string. Затем мы split этой строки, чтобы получить все отдельные words.
Теперь мы можем использовать метод count и создать dictionary для хранения счетчиков. Мы можем создать list из items, который мы хотим извлечь из dicionary, и получить только те keys.
у ваших дат такой же формат?