2017-01-12 76 views
1

我有一個看起來像這樣,每月的數據點的數據幀:重建索引蟒蛇數據幀創建NaN值

Date  Value 
1 2010-01-01 18.45 
2 2010-02-01 18.13 
3 2010-03-01 18.25 
4 2010-04-01 17.92 
5 2010-05-01 18.85 

我想讓它每天的數據,並與當前所產生的新日期填寫月價值。例如:

Date  Value 
1 2010-01-01 18.45 
2 2010-01-02 18.45 
3 2010-01-03 18.45 
4 2010-01-04 18.45 
5 2010-01-05 18.45 
.... 

這是我使用添加的臨時日期,並填寫值碼:

today = get_datetime('US/Eastern') #.strftime('%Y-%m-%d') 
enddate='1881-01-01' 
idx = pd.date_range(enddate, today.strftime('%Y-%m-%d'), freq='D') 
df = df.reindex(idx) 
df = df.fillna(method = 'ffill') 

輸出如下:

     Date Value 
2010-01-01 00:00:00 NaN NaN 
2010-01-02 00:00:00 NaN NaN 
2010-01-03 00:00:00 NaN NaN 
2010-01-04 00:00:00 NaN NaN 
2010-01-05 00:00:00 NaN NaN 

日誌顯示NaN值恰好在.fillna方法被調用之前出現。所以前鋒並不是罪魁禍首。

任何想法爲什麼會發生這種情況?

回答

1

你需要每月通話重新索引

test = pd.DataFrame(np.random.randn(4), index=pd.date_range('2017-01-01', '2017-01-04'), columns=['test']) 
test.reindex(pd.date_range('2017-01-01', '2017-01-05'), method='ffill') 
2

選項3
最保險的做法,很一般
上採樣到日常,然後組的變換前索引添加到原數據幀

這個重要的原因是,你的一天可能不會在本月的第一個月。如果你想確保該天值獲取隔日月播出,爲此

df.set_index('Date').asfreq('D') \ 
    .groupby(pd.TimeGrouper('M')).Value \ 
    .transform('first').reset_index() 

選項2
asfreq

df.set_index('Date').asfreq('D').ffill().reset_index() 

選項3
resample

df.set_index('Date').resample('D').first().ffill().reset_index() 

對於pandas=0.16.1

df.set_index('Date').resample('D').ffill().reset_index() 

所有產生相同的結果移到該試樣數據集合

enter image description here

+0

THX。我嘗試了選項3,並得到一個錯誤。我想知道在我工作的環境(Quantopian)中方法是否被識別。你是否需要導入任何特定的操作? – jhomme

+0

我正在運行熊貓版本0.16.1 – jhomme

+0

什麼是錯誤? – piRSquared