Pandas类型错误试图绘制

时间:2015-11-12 16:36:37

标签: python pandas matplotlib

我尝试根据Pandas数据帧创建基本散点图。但是当我调用分散例程时,我得到一个错误" TypeError:无效的类型提升"。重现问题的示例代码如下所示:

t1 = pd.to_datetime('2015-11-01 00:00:00')
t2 = pd.to_datetime('2015-11-02 00:00:00')

Time = pd.Series([t1, t2])
r = pd.Series([-1, 1])

df = pd.DataFrame({'Time': Time, 'Value': r})
print(df)

print(type(df.Time))
print(type(df.Time[0]))

fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.scatter(df.Time, y=df.Value, marker='o')

结果输出

        Time  Value
0 2015-11-01     -1
1 2015-11-02      1
<class 'pandas.core.series.Series'>
<class 'pandas.tslib.Timestamp'>

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-285-f4ed0443bf4d> in <module>()
     15 fig = plt.figure(figsize=(x_size,y_size))
     16 ax = fig.add_subplot(111)
---> 17 ax.scatter(df.Time, y=df.Value, marker='o')

C:\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in scatter(self, x,    y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, **kwargs)
   3635             edgecolors = 'face'
   3636 
-> 3637         offsets = np.dstack((x, y))
   3638 
   3639         collection = mcoll.PathCollection(

C:\Anaconda3\lib\site-packages\numpy\lib\shape_base.py in dstack(tup)
    365 
    366     """
--> 367     return _nx.concatenate([atleast_3d(_m) for _m in tup], 2)
    368 
    369 def _replace_zero_by_x_arrays(sub_arys):

TypeError: invalid type promotion

搜索我发现了一个类似的帖子Pandas Series TypeError and ValueError when using datetime,这表明错误是由于系列中有多种数据类型引起的。但这似乎不是我的例子中的问题,正如我打印的类型信息所证明的那样。

请注意,如果我停止使用pandas datetime对象并制作&#39; Time&#39;相反,它可以正常工作,例如。

t1 = 1.1 #
t2 = 1.2

Time = pd.Series([t1, t2])
r = pd.Series([-1, 1])

df = pd.DataFrame({'Time': Time, 'Value': r})
print(df)

print(type(df.Time))
print(type(df.Time[0]))

fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.scatter(df.Time, y=df.Value, marker='o')

带输出

   Time  Value
0   1.1     -1
1   1.2      1
<class 'pandas.core.series.Series'>
<class 'numpy.float64'>

图表看起来很好。我不知道为什么使用datetime会导致无效的类型提升错误?我使用的是Python 3.4.3和pandas 0.16.2。

7 个答案:

答案 0 :(得分:10)

谢谢@martinvseticka。我认为根据您指出的numpy代码,您的评估是正确的。我能够更简化你的调整(并增加了第三个样本点)来获得

t1 = pd.to_datetime('2015-11-01 00:00:00')
t2 = pd.to_datetime('2015-11-02 00:00:00')
t3 = pd.to_datetime('2015-11-03 00:00:00')

Time = pd.Series([t1, t2, t3])
r = pd.Series([-1, 1, 0.5])

df = pd.DataFrame({'Time': Time, 'Value': r})

fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.plot_date(x=df.Time, y=df.Value, marker='o')

关键似乎是调用'plot_date'而不是'plot'。这似乎告诉mapplotlib不要尝试连接数组。

答案 1 :(得分:7)

还有另一种方法,我们应该放弃使用系列。只需使用列表的时间。

t1 = pd.to_datetime('2015-11-01 00:00:00')
t2 = pd.to_datetime('2015-11-02 00:00:00')

Time = pd.Series([t1, t2])
r = pd.Series([-1, 1])

df = pd.DataFrame({'Time': Time, 'Value': r})
print(df)

print(type(df.Time))
print(type(df.Time[0]))
x_size = 800
y_size = 600
fig = plt.figure(figsize=(x_size,y_size))
ax = fig.add_subplot(111)
ax.scatter(list(df.Time.values), list(df.Value.values), marker='o')

答案 2 :(得分:4)

这是你在找什么?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import matplotlib.dates as dates

t1 = pd.to_datetime('2015-11-01 00:00:00')
t2 = pd.to_datetime('2015-11-02 00:00:00')

idx = pd.Series([t1, t2])
s = pd.Series([-1, 1], index=idx)

fig, ax = plt.subplots()
ax.plot_date(idx, s, 'v-')
plt.tight_layout()
plt.show()

我是Python的新手,所以希望我没错。基本上,我尝试根据https://stackoverflow.com/a/13674286/99256调整您的示例。

您的脚本存在问题numpy tries要连接df.Timedf.Value系列,它无法为新数组找到合适的类型,因为一个数组是数字,第二个数组由Timestamp个实例组成。

答案 3 :(得分:3)

scatter图有一些无法在plotplot_date中模拟的属性(因为能够绘制不同大小的标记)。

在绘制散点图之前,将类型为pandas.tslib.Timestamp的时间序列转换为类型:datetime.datetime的列表对我来说很有用:

times = [d.to_pydatetime() for d in df.Time]]
ax.scatter(times, y=df.Value, marker='o')

答案 4 :(得分:1)

您也可以这样做:

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import datetime

    df = pd.DataFrame({"Time":["2015-11-01 00:00:00", "2015-11-02 00:00:00"], "value":[ 1, -1]})
    df['Time'] = pd.to_datetime(df['Time'])
    fig, ax = plt.subplots()
    ax.scatter(np.arange(len(df['Time'])), df['value'], marker='o')
    ax.xaxis.set_ticks(np.arange(len(df['Time'])))
    ax.xaxis.set_ticklabels(df['Time'], rotation=90)
    plt.xlabel("Time")
    plt.ylabel("value")

    plt.show()

答案 5 :(得分:1)

我在fly中将日期时间列的类型更改为字符串:

plt.scatter(df['Date'].astype('str'), df['Category'], s=df['count'])

并且散点图有效。 此致

答案 6 :(得分:0)

以上所有答案都是惊人的。但是,就我而言,该错误是通过更新库来修复的。您可以使用Conda终端执行以下命令, 康达更新--all