我有一个清单:
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元素。任何帮助,将不胜感激。感谢。
答案 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
请注意,我在这里任意使用了本月的第一天。