TypeError:float()参数必须是字符串或数字,而不是' Period'

时间:2017-04-04 11:55:38

标签: python pandas matplotlib

我有一个像这样的列的pandas数据框:

df.columns = pd.to_datetime(list(df)) #list(df) = ["2017-01", "2016-01", ...]

然后我在数据集的每一行中执行插值,因为我有一些我想要摆脱的NaN。结果如下:

ORIGINAL  
2007-12-01     NaN 
2008-12-01     NaN 
2009-12-01     NaN 
2010-12-01   -0.35 
2011-12-01    0.67 
2012-12-01     NaN 
2013-12-01     NaN 
2014-12-01    1.03 
2015-12-01    0.37 
2016-12-01     NaN 
2017-12-01     NaN 
Name: row1, dtype: float64 

INTERPOLATION  
2007-12-01   -0.350000 
2008-12-01   -0.350000 
2009-12-01   -0.350000 
2010-12-01   -0.350000 
2011-12-01    0.670000 
2012-12-01    0.790219 
2013-12-01    0.910109 
2014-12-01    1.030000 
2015-12-01    0.370000 
2016-12-01    0.370000 
2017-12-01    0.370000 
Name: row1, dtype: float64

然后我尝试绘制插值行并得到:

TypeError: float() argument must be a string or a number, not 'Period' 

整个代码:

print("ORIGINAL\n", series)
interpolation = series.interpolate(method=func, limit=10, limit_direction='both')
interpolation.plot()
print("INTERPOLATION\n",interpolation)

在我看来,错误是在系列中的时间值,但我认为matplotlib应该很容易处理它,所以我肯定做错了。提前谢谢。

5 个答案:

答案 0 :(得分:3)

如果我这样做,那就有效:

plt.plot(row.index, row.values)
plt.show()

我不知道为什么......

答案 1 :(得分:3)

这是Pandas中的一个错误,如果一切顺利的话,将由next major release by August 31, 2018修复。

目前,@ J63的解决方法必须要做。那,或者安装早期版本的pandas,例如0.20.2。

答案 2 :(得分:1)

复制插值结果

df = pd.read_clipboard(header=None)
df.columns = ['Period','Value']
df['Period'] = pd.to_datetime(df['Period'])
df  = df.set_index('Period')
print(df)

               Value
Period              
2007-12-01 -0.350000
2008-12-01 -0.350000
2009-12-01 -0.350000
2010-12-01 -0.350000
2011-12-01  0.670000
2012-12-01  0.790219
2013-12-01  0.910109
2014-12-01  1.030000
2015-12-01  0.370000
2016-12-01  0.370000
2017-12-01  0.370000


df.plot()

enter image description here

答案 3 :(得分:0)

这是最简单的答案,无需升级或降级熊猫。

pd.plotting.register_matplotlib_converters()

来源:Link

答案 4 :(得分:0)

OMG,我花了半天时间。我的问题是我使用的是绘制一个空的 Pandas df,然后尝试使用 plt.plot 在该轴的顶部绘制。第二次调用抛出错误:

<块引用>

对于 df_err.itertuples() 中的行: df_sub.plot(legend=False) #如果 df 为空,则第二次调用 plot 在不同的 x 轴类型上

plt.plot(row.name,row.original_value,'x')