【问题标题】:Scatter plots matplotlib: Dealing with pandas datetime as index散点图matplotlib:处理熊猫日期时间作为索引
【发布时间】:2019-07-12 08:24:56
【问题描述】:

对于一些背景信息,我想创建一个不同数据帧的散点图(每个数据帧都是从 csv 读取的),其中 x 值是日期,y 值是水位。

我一直在努力研究如何制作散点图,其中 x 值是日期或索引。在尝试了多种选择之后,我觉得这是迄今为止我遇到的“最佳”错误:

    KeyError: "None of [DatetimeIndex(['2017-11-04 00:00:00',    
    '2017-11-04 01:00:00',\n ... '2018-02-26 11:00:00', '2018-02-26 
    12:00:00'],\n dtype='datetime64[ns]', name='date', length=2749, 
    freq=None)] are in the [columns]" .   

我正在从一个看起来像这样的 csv 文件导入我的数据:

    date,               level
    2017-10-26 14:00:00, 700.1
    2017-10-26 15:00:00, 500.5
    2017-10-26 16:00:00, NaN
               ...

我正在像这样读取文件:

df = pd.read_csv("data.csv", parse_dates=['date'],sep='\s*,\s*')
df.set_index('date', inplace=True)
df = df.loc['2017-11-04 00:00:00':]

那么这是我尝试绘制散点图的尝试:

ax = df.plot()
ax1 = df.plot(kind='scatter', x=df.index, y='level', color='r')

# ... my other dataframes I'd like to plot on the same graph...

我才开始使用 pandas,因此对我缺乏理解深表歉意。我一直在摆弄导入 csv 的不同方式(sep='\s*,\s*' 是一种尝试)但无济于事。非常感谢任何建议,谢谢。

编辑:更详尽的代码

data1.csv:

date,level
2017-10-26 14:00:00,500.1
2017-10-26 15:00:00,600.5
2017-10-26 16:00:00,NaN
2017-10-26 17:00:00,NaN
2017-10-26 18:00:00,NaN
2017-10-26 19:00:00,600.5
2017-10-26 20:00:00,600.5
2017-10-26 21:00:00,700.0
2017-10-26 22:00:00,700.0

data2.csv:

date,level
2017-10-26 15:00:00,600.5
2017-10-26 16:00:00,NaN
2017-10-26 17:00:00,NaN
2017-10-26 18:00:00,NaN
2017-10-26 19:00:00,600.5
2017-10-26 20:00:00,600.5
2017-10-26 21:00:00,900.0
2017-10-26 22:00:00,900.0
2017-10-26 23:00:00,NaN

代码:

import pandas as pd
import warnings
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')

df = pd.read_csv("data1.csv", parse_dates=['date'],sep='\s*,\s*')
df.set_index('date', inplace=True)
df = df.loc['2017-10-26 15:00:00':]

df2 = pd.read_csv("data2.csv", parse_dates=['date'],sep='\s*,\s*')
df2.set_index('date', inplace=True)
df2 = df2.loc[:'2017-10-26 22:00:00']

ax1 = df.plot(kind='scatter', x='date', y='level', color='r')
ax2 = df2.plot(kind='scatter', x='date', y='level', color='g',      ax=ax1)

plt.show()

【问题讨论】:

  • x 应该是您的数据框的列名。 x="date" 不起作用吗?或者完全删除那个论点?
  • 这本来是我想做的,但不幸的是不起作用,所以x='date'我得到KeyError: 'date'。当我删除“x”参数时,我收到抱怨说它必须在那里。另外,当我输入df.columns 时,我只会返回“级别”,这可能是因为我将日期设为索引,也许?
  • 哦,是的。将“日期”保留为列,以便能够在 x 参数中使用它。
  • 所以这可能会变成一个不同的问题,但是如果我删除 df.set_index('date', inplace=True) 我会收到此错误:ValueError: view limit minimum -36837.575000000004 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units 您认为您可以通过阐明这一点来帮助我吗?就像我不确定如何同时做到这两点一样。此错误显示在 ax = df1.plot()
  • 注意没有minimal reproducible example真的很麻烦。所以我只能评论个别步骤,而不仅仅是提供一个可行的答案。很可能熊猫无法绘制带有日期的散点图。你总是可以做的是plt.scatter(df["date"].values, df['level'].values)

标签: python pandas datetime matplotlib


【解决方案1】:

如果有人遇到同样的问题,我找到了一个解决方法,如下所述:pandas scatter plotting datetime

我刚刚添加了style='o',如下所示:

df = pd.read_csv("data1.csv", parse_dates=['date'],sep='\s*,\s*')
df.set_index('date', inplace=True)
df = df.loc['2017-10-26 15:00:00':]
ax = df.plot(style='o')

df2 = pd.read_csv("data2.csv", parse_dates=['date'],sep='\s*,\s*')
df2.set_index('date', inplace=True)
df2 = df2.loc[:'2017-10-26 22:00:00']
df2.plot(ax=ax,style='o')

plt.show()

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2018-06-29
    • 2013-07-20
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多