2013-06-13 87 views
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'.....] 

感謝。

+0

問題是什麼? –

+0

「我需要的是結合每個月對應的所有值,最好以包含月份作爲關鍵字和值作爲值的字典的形式。」 – user2480542

+1

對,我找到了那部分。不過,這不是一個問題。當你試圖實現「結合每個月對應的所有值時發生了什麼,最好是以包含月份作爲關鍵字和它們的值作爲值的字典的形式。」? –

回答

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) 
+0

非常感謝。然而,這種方法提供了一個包含所有日期及其相應值的字典。我一直在尋找基於月份的聚合......就像1月份的所有值都通過month_aggregate ['1/11']來訪問。我很抱歉我的英語,這是不好的..讓我知道你是否需要它改寫。 – user2480542

+1

以上兩種方法中的任何一種都會按月收集。第一個創建與一個月相對應的日期對象(每天映射到月的第一個月)。第二個使用月/年形式的鍵。 這取決於你想要做什麼 - 如果你想對鍵進行進一步的日期計算,那麼把它們作爲日期對象可能是有用的,但是如果你想顯示那個特定形式的鍵,那麼就把它們保存爲字符串。 – Owen

+0

謝謝歐文,很棒的方法:-) – user2480542

3

大熊貓非常適合這一點,如果你不介意另一依賴:

例如:

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 

然而,真正整潔的東西是分組DataFrame的聚合。例如,如果我們想看到的最小,最大和按月份劃分值的含義:

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.0 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 
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']}