1

我有一个清单:

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 元素。任何帮助,将不胜感激。谢谢。

4

2 回答 2

1

我认为一个更简单的解决方案是遍历该范围内的月份和年份,并添加缺少的那些。


dict如果您使用 a而不是 a listof two-element s,这会更容易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 作为默认值并通过循环数年和数月而不是循环遍历集合来处理它们?

于 2013-08-17T00:45:17.653 回答
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

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

于 2013-08-17T00:53:30.933 回答