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

より簡単な解決策は、範囲内の月と年を繰り返し、不足しているものを追加することだと思います。


これは、2 要素のdicta の代わりに aを使用した方が簡単なので、最初にそれを行いましょう。listlist

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 に答える