2016-01-21 56 views
1

我嘗試使用interpolate()方法在我的DataFrame中內插NaN。但是,該方法失敗,出現錯誤:即使大部分數據都已填充,也不能插入數據幀

不能插值所有NaN。

下面的代碼:

try: 
    df3.interpolate(method='index', inplace=True) 
    processor._arma(df3['TCA']) 
except Exception, e: 
    sys.stderr.write('%s: [%s] %s\n' % (time.strftime("%Y-%m-%d %H:%M:%S"), nid3, e)) 
    sys.stderr.write('%s: [%s] len=%d\n' % (time.strftime("%Y-%m-%d %H:%M:%S"), nid3, len(df3.index))) 
    sys.stderr.write('%s: [%s] %s\n' % (time.strftime("%Y-%m-%d %H:%M:%S"), nid3, df3.to_string())) 

這是奇怪的,因爲大部分數據已經填滿,你可以在日誌1個日誌2看到。數據幀的長度爲20,如下所示的所有數據。即使每個單元格被填充,我仍然不能使用插值方法。順便說一下,df3是一個全球價值,我不知道這是否會是一個問題。


日誌1個

2016-01-21 22:06:11: [ESIG_node_003_400585511] Cannot interpolate with all NaNs. 
2016-01-21 22:06:11: [ESIG_node_003_400585511] len=20 
2016-01-21 22:06:11: [ESIG_node_003_400585511] 
        TCA TCB TCC 
2016-01-21 20:06:22 19 17 18 
2016-01-21 20:06:23 19 17 18 
2016-01-21 20:06:24 18 18 18 
2016-01-21 20:06:25 18 17 18 
2016-01-21 20:06:26 18 18 18 
2016-01-21 20:06:27 19 18 18 
2016-01-21 20:06:28 19 17 18 
2016-01-21 20:06:29 18 18 18 
2016-01-21 20:06:30 18 17 18 
2016-01-21 20:06:31 19 17 18 
2016-01-21 20:06:32 18 17 18 
2016-01-21 20:06:33 18 18 18 
2016-01-21 20:06:34 19 18 18 
2016-01-21 20:06:35 18 17 18 
2016-01-21 20:06:36 19 18 18 
2016-01-21 20:06:37 18 18 18 
2016-01-21 20:06:38 18 18 18 
2016-01-21 20:06:39 19 18 18 
2016-01-21 20:06:40 18 17 18 
2016-01-21 20:06:41 18 18 18 

日誌2

2016-01-21 22:06:14: [ESIG_node_003_400585511] Cannot interpolate with all NaNs. 
2016-01-21 22:06:14: [ESIG_node_003_400585511] len=20 
2016-01-21 22:06:14: [ESIG_node_003_400585511] 
         TCA TCB TCC 
2016-01-21 20:06:33 18 18 18 
2016-01-21 20:06:34 19 18 18 
2016-01-21 20:06:35 18 17 18 
2016-01-21 20:06:36 19 18 18 
2016-01-21 20:06:37 18 18 18 
2016-01-21 20:06:38 18 18 18 
2016-01-21 20:06:39 19 18 18 
2016-01-21 20:06:40 18 17 18 
2016-01-21 20:06:41 18 18 18 
2016-01-21 20:06:42 NaN NaN NaN 
2016-01-21 20:06:43 NaN NaN NaN 
2016-01-21 20:06:44 NaN NaN NaN 
2016-01-21 20:06:45 NaN NaN NaN 
2016-01-21 20:06:46 19 18 18 
2016-01-21 20:06:47 18 17 18 
2016-01-21 20:06:48 18 18 18 
2016-01-21 20:06:49 19 18 18 
2016-01-21 20:06:50 18 17 18 
2016-01-21 20:06:51 18 18 18 
2016-01-21 20:06:52 19 17 18 
+0

您確定'method = index'可以在第一列的日期 - 時間值上工作嗎? – Evert

+0

我試過'method ='index'','method ='time''或者沒有方法。它們都不起作用。 –

+0

但'method = time'不可能在其他列上工作。你是否嘗試了逐列,看看哪些作品,哪些沒有? – Evert

回答

5

檢查您的數據幀具有數字dtypes,不object dtypes。如果DataFrame 包含object dtype列,則可能發生 TypeError: Cannot interpolate with all NaNs。例如,如果

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'A':np.array([1,np.nan,30], dtype='O')}, 
        index=['2016-01-21 20:06:22', '2016-01-21 20:06:23', 
         '2016-01-21 20:06:24']) 

然後df.interpolate()引發TypeError。

要檢查您的數據幀中的列與對象D型,看df3.dtypes

In [92]: df.dtypes 
Out[92]: 
A object 
dtype: object 

爲了解決這個問題,你需要確保數據框與 本地NumPy的dtypes數字列。顯然,最好從一開始就正確地構建DataFrame 。所以最好的解決方案取決於您如何構建DataFrame 。

甲不太吸引人貼片式修復將是使用pd.to_numeric到對象陣列轉換爲數值陣列後的,事實:

for col in df: 
    df[col] = pd.to_numeric(df[col], errors='coerce') 

隨着errors='coerce',不能被轉換爲數字的任何值被轉換成NaN。每列調用pd.to_numeric後,請注意,D型,現在是float64

In [94]: df.dtypes 
Out[94]: 
A float64 
dtype: object 

一旦數據幀具有數字dtypes和數據框有DatetimeIndex,然後df.interpolate(method='time')將工作:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'A':np.array([1,np.nan,30], dtype='O')}, 
        index=['2016-01-21 20:06:22', '2016-01-21 20:06:23', 
         '2016-01-21 20:06:24']) 

for col in df: 
    df[col] = pd.to_numeric(df[col], errors='coerce') 
df.index = pd.DatetimeIndex(df.index) 
df = df.interpolate(method='time') 
print(df) 

產生

     A 
2016-01-21 20:06:22 1.0 
2016-01-21 20:06:23 15.5 
2016-01-21 20:06:24 30.0 
+0

您的答案對於瞭解問題來自何處以及如何解決問題很有幫助。正如你所說,3列確實有'對象'類型。其餘的,我需要明天檢查一下。所以你的答案稍後會被接受。多謝 !! –