2015-08-18 95 views
2

我正在使用Python來創建列表。應該很容易!我不知道我爲什麼這麼掙扎。根據Python列表中的月份列表製作列表

我有一些數據是按日期計算的。有一個日期列是這樣的:

Created on 
5/1/2015 
5/1/2015 
6/1/2015 
6/1/2015 
7/1/2015 
8/1/2015 
8/1/2015 
8/1/2015 

在這種情況下,就在五月創造了2臺,2臺,6月,7月1日單位,並於8月3日單位。

我想反映在,4月份開始列表(【4月計數,計數五月,六月數等...):

NumberofUnits = [0, 2, 3, 1, 3, 0, 0, 0, 0, 0, 0, 0] 

我有個

的一個很好的列表
monthnumbers 

Out[69]: [8, 5, 6, 7] 

我也有一個列表unitcounts = [2, 3, 1, 3]我得到了這個使用value_counts。

所以這是一個製作零列表並用unitcount列表替換零件的問題,對吧?

出於某種原因,我所有的嘗試都不是列出一個列表或是列出一個零。

NumberofUnits = [0]*12 

for i in range(0,len(monthnumbers)): 
    if **monthnumbers[i] == (i+4):** **This part is wrong**  
     NumberofUnits.append(unitcounts[i]) 
     s = slice(0,i+1) 

我也試過

NumberofUnits = [] 
for i in range(0, 12): 
    if len(NumberofUnits) > i: 
     unitcounts[i:]+unitcounts[:i] 
     NumberofUnits.append(unitcounts[i]) 
     s = slice(0,i+1) 
    else: 
     unitcounts.append(0) 

但這並不考慮,在這一輪我的數據與5月份開始的事實,所以我在第一個插槽需要一個零。

+0

只有兩個條目從五月起。 – zero323

回答

1

可以使用collections.counter

from collections import Counter 

lines = ['5/1/2015', '5/1/2015', ..., '8/1/2015'] 
month_numbers = [int(line.split("/")[0]) for line in lines] 

cnt = Counter(month_numbers) 

統計條目如果你已經有了數,你可以用

from collections import defaultdict 

cnt = defaultdict(int, zip(monthnumbers, unitcounts)) 

以上更換和簡單的映射條目與(MONTH_NUMBER - 偏移)MOD 12:

[x[1] for x in sorted([((i - offset) % 12, cnt[i]) for i in range(1, 13)])] 
1

如果數據來自文件或任何迭代,您可以使用OrderedDict,爲了從4/april開始創建的鍵,然後增加你遇到每個月的計處將在要求的順序結束的最後打印的值的列表:

from collections import OrderedDict 

od = OrderedDict((i % 12 or 12, 0) for i in range(4, 16)) 
# -> OrderedDict([(4, 0), (5, 0), (6, 0), (7, 0), (8, 0), (9, 0), (10, 0), (11, 0), (12, 0), (1, 0), (2, 0), (3, 0)]) 

with open("in.txt") as f: 
    for line in f: 
     mn = int(line.split("/",1)[0]) 
     od.setdefault(mn, 0) 
     od[mn] += 1 

print(list(od.values())) 
[0, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0, 0] 

除非你做的邏輯就像上面所說的那樣,當你真正解析數據的時候關聯數據,那麼計算哪一個月的計數會更加困難。立即創建關聯是一種更簡單的方法。

如果你有一個列表,元組等值的邏輯是完全一樣的:

for dte in list_of_dates: 
     mn = int(dte.split("/",1)[0]) 
     od.setdefault(mn, 0) 
     od[mn] += 1 
+0

感謝您的回答。我很困惑,但是你的in.text文件是什麼? – jenryb

+0

@jenryb,我只是用你的問題中的日期,它們來自哪裏並不重要,邏輯完全一樣,只是迭代日期並應用它。 –

+0

謝謝。這工作並削減了我以前嘗試的大量不必要的計數代碼。 – jenryb

1

爲什麼不乾脆:

counter = [0]*12 
for m in monthnumbers: 
    counter[(m - 4) % 12] += 1 

print counter 
0

以下是更多的「老派」做法。它假定您的日期位於您的CSV文件的第一列,即cols[0]。它驗證輸入日期,如果日期無效或者比最後一個更舊,它將引發ValueError異常。如果您的輸入跳過一個或多個月,它也將應付。

import csv 
from datetime import datetime 

with open("input.csv", "r") as f_input: 
    csv_input = csv.reader(f_input) 
    header = next(csv_input) 
    last_date = datetime(year=2015, month=4, day=1) 
    cur_total = 0 
    units_by_month = [] 

    for cols in csv_input: 
     cur_date = datetime.strptime(cols[0], "%m/%d/%Y") 

     if cur_date.month == last_date.month: 
      cur_total += 1 
     elif cur_date < last_date: 
      raise ValueError, "Date is older" 
     else: 
      extra_months = ((cur_date.month + 12 - last_date.month) if cur_date.year - last_date.year else (cur_date.month - last_date.month)) - 1 
      units_by_month.extend([cur_total] + ([0] * extra_months)) 
      last_date = cur_date 
      cur_total = 1 

    units_by_month.extend([cur_total] + [0] * ((8-len(units_by_month)) if len(units_by_month) < 9 else 0)) 
    print units_by_month 

因此,對於你輸入它會給下面的輸出:

[0, 2, 2, 1, 3, 0, 0, 0, 0, 0] 

如果一個額外的項添加3/1/2016,以下將顯示:

[0, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0, 1]