2017-07-25 165 views
3

我正在努力提取財務數據,其中一些格式爲年度,其他爲每月。我的模型每月需要全部,因此我需要每個月重複同樣的年度值。我一直在使用這個stack post並試圖使代碼適應我的數據。熊貓將每年轉換爲每月

這是我的數據幀:

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行:

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['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 
... 

爲了解決這個問題每ticker

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

我得到的錯誤ValueError異常:不能重新編制一個非唯一索引用的方法或限制 – jKraut

+0

我想原因是我有多個代號,因此日期重複 – jKraut

+0

@jKraut查看更新的帖子 – piRSquared