4

我有一个包含多个列表的 python 列表:

 A = [['1/1/1999', '3.0'], 
      ['1/2/1999', '4.5'],
      ['1/3/1999', '6.8'],
      ......
      ......

      ['12/31/1999', '8.7']]

我需要的是结合每个月对应的所有值,最好以字典的形式包含月份作为键,它们的值作为值。

例子:

   >>> A['1/99']
   >>> ['3.0', '4.5', '6.8'.....]

或者以列表列表的形式,使得:

例子:

  >>> A[0]
  >>> ['3.0', '4.5', '6.8'.....]

谢谢。

4

3 回答 3

3

如果您不介意另一个依赖项,Pandas 非常适合:

例如:

import pandas
import numpy as np

# Generate some data
dates = pandas.date_range('1/1/1999', '12/31/1999')
values = (np.random.random(dates.size) - 0.5).cumsum()

df = pandas.DataFrame(values, index=dates)

for month, values in df.groupby(lambda x: x.month):
    print month
    print values

然而,真正巧妙的是分组数据帧的聚合。例如,如果我们想查看按月份分组的值的最小值、最大值和平均值:

print df.groupby(lambda x: x.month).agg([min, max, np.mean])

这产生:

         min       max      mean
1  -0.812627  1.247057  0.328464
2  -0.305878  1.205256  0.472126
3   1.079633  3.862133  2.264204
4   3.237590  5.334907  4.025686
5   3.451399  4.832100  4.303439
6   3.256602  5.294330  4.258759
7   3.761436  5.536992  4.571218
8   3.945722  6.849587  5.513229
9   6.630313  8.420436  7.462198
10  4.414918  7.169939  5.759489
11  5.134333  6.723987  6.139118
12  4.352905  5.854000  5.039873
于 2013-06-13T02:52:40.373 回答
2
    from collections import defaultdict
    from datetime import date

    month_aggregate = defaultdict (list)
    for [d,v] in A:
        month, day, year = map(int, d.split('/'))
        date = date (year, month, 1)
        month_aggregate [date].append (v)

我遍历每个日期和值,取出年份和月份并使用这些值创建一个日期。然后我将该值附加到与该年份和月份关联的列表中。

或者,如果您想使用字符串作为键,那么您可以

    from collections import defaultdict

    month_aggregate = defaultdict (list)
    for [d,v] in A:
        month, day, year = d.split('/')
        month_aggregate [month + "/" + year[2:]].append (v)
于 2013-06-13T02:14:29.657 回答
1

这是我的解决方案,不包括

def getKeyValue(lst):
    a = lst[0].split('/')
    return '%s/%s' % (a[0], a[2][2:]), lst[1]

def createDict(lst):
    d = {}
    for e in lst:
        k, v = getKeyValue(e)
        if not k in d:    d[k] = [v]
        else:             d[k].append(v)
    return d

A = [['1/1/1999', '3.0'],
     ['1/2/1999', '4.5'],
     ['1/3/1999', '6.8'],
     ['12/31/1999', '8.7']]

print createDict(A)
>>>{'1/99': ['3.0', '4.5', '6.8'], '12/99': ['8.7']}
于 2013-06-13T05:26:23.680 回答