2015-11-29 3 views
2

У меня есть список, такой как следующий, который содержит логические значения для каждой даты в течение нескольких месяцев. Я хотел бы определить количество логических логических элементов в каждом месяце с конечной целью определения ежемесячного «ложного» процента за каждый месяц. Например, если в ноябре было 15 дней, которые были ложными, я хотел бы показать 50% за ноябрь. Как это можно сделать в Python?Подсчитайте количество ложных булевых элементов в месяц в списке дат?

list = [('2015-11-01', False), ('2015-11-02', True), ('2015-11-03', True), ('2015-11-04', True), ('2015-11-05', True)] 
+5

Сообщите нам ваше усилие кодирования, пожалуйста? – Nayuki

ответ

0

Это заявление будет возвращать список длиной 12, содержащее число истинных значений для каждого соответствующего месяца, переменного «список»:

[sum([1 if int(pair[0][5:7]) == n and pair[1] else 0 for pair in list]) for n in range(1, 13)] 

Удаляя и утверждение, это утверждение возвращает общее количество записей для каждого месяца в виде списка

[sum([1 if int(pair[0][5:7]) == n else 0 for pair in list]) for n in range(1, 13)] 

Объединив два предыдущих заявления, мы можем получить список процентов как таковые:

trues = [sum([1 if int(pair[0][5:7]) == n and pair[1] else 0 for pair in list]) for n in range(1, 13)] 
total = [sum([1 if int(pair[0][5:7]) == n else 0 for pair in list]) for n in range(1, 13)] 
percentages = [trues[n]/float(total[n]) * 100 if total[n] != 0 else None for n in range(12)] 

В которой, если в месяце 0 записей не будет возвращать None

-EDIT-

Я интерпретировал это, как видим, какой процент от всех введенных значений в течение определенного месяца истинны, но если вы ищете проценты всех дней в месяце, которые имеют значение с истинным, просто изменить общую переменный:

total = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 

(при условии не високосный год)

2

Хранить данные в Словаре, используя год, как внешний ключ к группе по годам и за каждый год подсчитать количество раз вы видите Ложные:

from collections import defaultdict 
d = defaultdict(lambda: defaultdict(float)) 

from calendar import monthrange, month_name 
for k, v in lst: 
    year, mth, _ = k.split("-") 
    d[int(year)][int(mth)] += not v 

for year, dct in d.items(): 
    for mn, v in dct.items(): 
     _, days = monthrange(year, mn) 
     print("Average for {}-{} is {}".format(year, month_name[mn], v/days)) 

После того, как у вас есть счет вы можете использовать правильный количество дней в месяц за конкретный год для расчета процента. Не каждый год имеет одинаковое количество дней в месяц, поэтому вы не можете использовать общий календарь для проверки или игнорирования года, календарный модуль обрабатывает дни для нас.

Создание некоторые случайные данные:

from random import choice 

lst = [('2015-09-{}'.format(i), choice((True, False))) for i in range(1,31)] + [('2015-11-{}'.format(i), choice((True, False))) for i in range(1,31)] 

Выходы:

Average for 2015-September is 0.533333333333 
Average for 2015-November is 0.6 

Если год всегда текущий год, то вы можете упростить создание Dict для:

from collections import defaultdict 
d = defaultdict(int) 
for k, v in lst: 
    year, mth,_= k.split("-") 
    d[mth] += not v 

print(d) 

Но просто убедитесь, что вы снова сравниваете количество дней.

Смежные вопросы