2015-11-29 34 views
2

我有一個如下列表,其中包含幾個月內每個日期的布爾值。我想確定每個月的假布爾值數量,最終目標是確定每個月的月度「假」百分比。例如,如果11月有15天是假的,我想在11月份顯示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項將返回無

CNC中

我解釋這是看到了一定的一個月是真正進入了多大比例的所有值,但如果你正在尋找的是在具有值標記真當月所有日子的百分比,只需改變總變量:

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 

如果一年始終是當前年份,那麼你可以簡化創建字典到:

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

print(d) 

但只要再次確認你比較正確的天數。

相關問題