TypeError:float() 参数必须是字符串或数字,而不是“期间”
Posted
技术标签:
【中文标题】TypeError:float() 参数必须是字符串或数字,而不是“期间”【英文标题】:TypeError: float() argument must be a string or a number, not 'Period' 【发布时间】:2017-08-29 14:43:53 【问题描述】:我有一个带有这样列的 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 应该能够处理它,所以我肯定做错了什么。提前致谢。
【问题讨论】:
【参考方案1】:这是最简单的答案,无需升级或降级熊猫。
pd.plotting.register_matplotlib_converters()
有时注册会导致另一个错误,例如 compute.use_bottleneck, use_numexpr 错误 以摆脱该调用取消注册:P
点赞:pd.plotting.deregister_matplotlib_converters()
来源:Link
【讨论】:
谢谢。绝对是 pandas 0.25 上最简单的解决方案 谢谢 - 这解决了我在使用 pandas 0.25 和 fbprophet 0.5 时遇到的具体问题。 pandas 0.25 和 fbprophet 0.3 没有发生。 太棒了,你是怎么想出来这个的。 使用您的解决方案时,我得到:TypeError: Axis must have 'freq' set to convert to Periods
。在 pandas 1.1 和 matplotlib 3.3.2 上运行。
@MarcelMotta 一旦出现此错误,只需添加以下代码:df.index = df.index.to_timestamp()
【参考方案2】:
如果我这样做,它会起作用:
plt.plot(row.index, row.values)
plt.show()
我不知道为什么...
【讨论】:
奇怪...但这解决了我的问题 pandas==0.25.3 和 fbprohpet==0.5 type(row.index) 返回:Pandas 对象的内置方法索引位于 0x000001D763176678,我无法直接绘制。上面的代码能用吗?【参考方案3】:这是 Pandas 中的一个错误,如果一切顺利,将由 next major release by August 31, 2018 修复。
目前,@J63 的解决方法必须要做。或者安装更早版本的 pandas,例如 0.20.2。
【讨论】:
或者您可以恢复到 pandas 0.20.2。这为我解决了这个问题。 你做什么 > pip install pandas==0.20.2 面临当前 0.20.3 的问题,并通过@CarlSmith 提到的降低到 0.20.2 来解决。【参考方案4】:复制了您的插值结果
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()
【讨论】:
哇,这很奇怪。 ``` print("ORIGINAL\n", row) ; row.plot() ; plt.show() ``` 给我同样的错误。因此,对于打印的值,情节有效,但对于存储的类型“期间”不...以上是关于TypeError:float() 参数必须是字符串或数字,而不是“期间”的主要内容,如果未能解决你的问题,请参考以下文章
Pandas :TypeError: float() 参数必须是字符串或数字,而不是 'pandas._libs.interval.Interval'
TypeError:float() 参数必须是字符串或数字,而不是与散点图相关的“datetime.time”
为啥在带有字符串和 NaN 的系列上得到“TypeError:'float' 类型的参数不可迭代”?
LabelEncoder -- TypeError: 参数必须是字符串或数字