2015-08-18 61 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]