在Python列表中将缺少的月值插入为0

时间:2013-08-17 00:41:22

标签: python datetime numpy

我有一个清单:

t = [['01-2012', 3], 
     ['02-2012', 2], 
     ['03-2012', 9], 
     ['04-2012', 1], 
     ['05-2012', 6], 
     ['06-2012', 40], 
     ['07-2012', 3], 
     ['08-2012', 282], 
     ['09-2012', 3], 
     ['12-2012', 6],
     ['02-2013', 16],
     ['04-2013', 9]]

我需要在此列表中的各个位置添加所有缺少的[mm-yyyy,value]元素[mm-yyyy,0],以便平滑所有缺失月份的时间序列。任何猜测?

现在我正在做的是按如下方式计算所有0值:

total_items = [0]*12

for d in t:
    month = int(d[0].split('-')[0], 10)
    total_items[month-1] = d[1]

所以这给了我所有的值,包括缺少月份的值为0,但我不知道如何为它们生成相应的mm-yyyy元素。任何帮助,将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

我认为更简单的解决方案是迭代范围内的月份和年份,并添加缺失的那些。


如果你使用dict代替list两元素list,这会更容易,所以让我们先做。

data = dict(t)
for year in range(2012, 2014):
    for month in range(1, 13):
        mmyyyy = '{:02}-{:04}'.format(month, year)
        data.setdefault(mmyyyy, 0)

然后,如果您想将其转换回原始格式,那也很容易:

t = [[k, v] for k, v in data.items()]

如果你需要按日期排序......那么,你的月份优先格式会让人觉得难看,但它肯定是可行的:

t = sorted(t, key=lambda kv: kv[0][3:] + kv[0][:2])

但是,正如最后一行所示,将日期作为日期对象而不是字符串来处理通常要容易得多。所以,您可能也想考虑这一点。


然而,也许不是插入0,你最好只保留0作为默认值并通过循环数年和数月来处理它们而不是循环遍历集合?

答案 1 :(得分:1)

您也可以使用pandas库进行此类操作

t = [['01-2012', 3], 
     ['02-2012', 2], 
     ['03-2012', 9], 
     ['04-2012', 1], 
     ['05-2012', 6], 
     ['06-2012', 40], 
     ['07-2012', 3], 
     ['08-2012', 282], 
     ['09-2012', 3], 
     ['12-2012', 6],
     ['02-2013', 16],
     ['04-2013', 9]]
t = array(t, dtype=object)
s = Series(t[:, 1], index=pd.to_datetime(t[:, 0])).convert_objects().sort_index()
s.resample('MS').fillna(0)

获取

2012-01-01      3
2012-02-01      2
2012-03-01      9
2012-04-01      1
2012-05-01      6
2012-06-01     40
2012-07-01      3
2012-08-01    282
2012-09-01      3
2012-10-01      0
2012-11-01      0
2012-12-01      6
2013-01-01      0
2013-02-01     16
2013-03-01      0
2013-04-01      9
Freq: MS, dtype: float64

请注意,我在这里任意使用了本月的第一天。