2017-07-25 17 views
3

私は毎年書式設定され、毎月毎月の財務データを取得する作業を進めています。私のモデルは毎月それを必要とするので、私は同じ毎年の価値が毎月繰り返される必要があります。私はこのstack postを使用していて、自分のデータにコードを適合させようとしています。ここでパンダは毎年毎月に変換する

は私のデータフレームです:

date ticker value 
0 1999-12-31 ECB/RA6 1.0 
1 2000-01-31 ECB/RA6 4.0 
2 2000-02-28 ECB/RA6 4.0 
3 2000-13-31 ECB/RA6 4.0 
4 2000-04-30 ECB/RA6 4.0 

そして、私のコード:ここで

df.head() 

    date ticker value 
0 1999-12-31 ECB/RA6 1.0 
1 2000-12-31 ECB/RA6 4.0 
2 2001-12-31 ECB/RA6 2.0 
3 2002-12-31 ECB/RA6 3.0 
4 2003-12-31 ECB/RA6 2.0 

は私の所望の出力最初の5行です

df['date'] = pd.to_datetime(df['date'], format='%Y-%m') 
df = df.pivot(index='date', columns='ticker') 
start_date = df.index.min() - pd.DateOffset(day=1) 
end_date = df.index.max() + pd.DateOffset(day=31) 
dates = pd.date_range(start_date, end_date, freq='M') 
dates.name = 'date' 
df = df.reindex(dates, method='ffill') 

df = df.stack('ticker') 
df = df.sortlevel(level=1) 
df = df.reset_index() 

しかし、それが繰り返されていません月は予想どおり

答えて

4

欲しいresample

まず、resampleが動作するようにインデックスを設定する必要があります。次に、索引を埋め戻してリセットします。

df.set_index('date').resample('M').bfill().reset_index() 

     date ticker value 
0 1999-12-31 ECB/RA6 1.0 
1 2000-01-31 ECB/RA6 4.0 
2 2000-02-29 ECB/RA6 4.0 
3 2000-03-31 ECB/RA6 4.0 
4 2000-04-30 ECB/RA6 4.0 
5 2000-05-31 ECB/RA6 4.0 
6 2000-06-30 ECB/RA6 4.0 
7 2000-07-31 ECB/RA6 4.0 
8 2000-08-31 ECB/RA6 4.0 
9 2000-09-30 ECB/RA6 4.0 
10 2000-10-31 ECB/RA6 4.0 
11 2000-11-30 ECB/RA6 4.0 
12 2000-12-31 ECB/RA6 4.0 
13 2001-01-31 ECB/RA6 2.0 
14 2001-02-28 ECB/RA6 2.0 
15 2001-03-31 ECB/RA6 2.0 
... 

が、私はエラーとValueErrorを得るticker

df.set_index('date').groupby('ticker', group_keys=False) \ 
    .resample('M').bfill().reset_index() 
+0

ごとにこれを処理するには、次の方法で非一意のインデックスのインデックスを再作成または私は理由は、私は複数のティッカーを持っていると思う – jKraut

+0

を制限することはできません、したがって、日付は繰り返されます – jKraut

+0

@jKraut更新された投稿を参照してください – piRSquared

関連する問題