【问题标题】:AttributeError: 'numpy.datetime64' object has no attribute 'toordinal'AttributeError:“numpy.datetime64”对象没有属性“toordinal”
【发布时间】:2018-12-08 14:53:13
【问题描述】:

我正在尝试绘制时间线

import datetime          as da
import matplotlib.dates  as dt

# Data
df = pd.DataFrame({'A': [da.datetime(2017,1,5,9,8),   da.datetime(2017,1,5,9,9),  da.datetime(2017,1,7,9,19), da.datetime(2017,1,7,9,19),  da.datetime(2017,1,7,9,19), da.datetime(2017,2,7,9,19), da.datetime(2017,2,7,9,19)],
                   'B': [da.datetime(2017,1,5,9,9),   da.datetime(2017,1,5,9,12), da.datetime(2017,1,7,9,26), da.datetime(2017,1,7,9,20),  da.datetime(2017,1,7,9,21), da.datetime(2017,2,7,9,23), da.datetime(2017,2,7,9,25)],
                   'C' :[1,                           2,                          3,                          4,                           5,                          6,                          7 ]})

# Visualisation
ax = plt.subplot()
ax = plt.hlines(df.C,
    dt.date2num(df.A),
    dt.date2num(df.B))

但得到错误:

AttributeError: 'numpy.datetime64' object has no attribute 'toordinal'

我认为是数据类型造成的:

df.A.dtype 
dtype('<M8[ns]')

我尝试了一些推荐的解决方案(转换器和 pandacnv),但仍然无法正常工作。

【问题讨论】:

    标签: python pandas numpy matplotlib timeline


    【解决方案1】:

    如果您的目标是使用 AB 列作为 x 轴和 C 列作为 y 轴绘制水平线,您可以直接使用数据框数组。将1 日添加到B 列,因为时间变化非常小,无法在图中观察到:

    df['B'] = df['B']+pd.Timedelta("1D")
    ax = plt.subplot()
    ax.hlines(df.C.values, df.A.values, df.B.values, lw=2)
    plt.show()
    

    输出图:

    【讨论】:

      【解决方案2】:

      我没有发现数据类型有任何问题。 问题可能是 B 列中的日期。作为@Sandeep Kadapa 的替代方法,您可以将最大日期设置为 xmax。例如:

       ax = plt.subplot()
      ax.hlines(df.C.values, df.A.values, xmax='2017-01-02')
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-01
        • 2021-04-19
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        相关资源
        最近更新 更多