【问题标题】:plot x-axis as date in matplotlib在 matplotlib 中将 x 轴绘制为日期
【发布时间】:2018-08-31 06:37:53
【问题描述】:

我正在尝试对数据进行一些分析。我得到了 csv 文件,并将其转换为 pandas 数据框。数据看起来像这样。它有几列,但我试图将 x 轴绘制为日期列。 .

熊猫数据框看起来像这样

print (df.head(10)

    cus-id        date       value_limit
0   10173         2011-06-12        455
1   95062         2011-09-11        455
2   171081        2011-07-05        212
3   122867        2011-08-18        123
4   107186        2011-11-23        334
5   171085        2011-09-02        376
6   169767        2011-07-03        34
7   80170         2011-03-23        34
8   154178        2011-10-02        34
9   3494          2011-01-01        34

我正在尝试绘制日期数据,因为同一日期有多个值。为此,我试图将 x-asis 刻度绘制为日期。因为日期列中的最小日期是 2011-01-01,最大日期是 2012-04-20。

我试过这样的

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

df = pd.read_csv('rio_data.csv', delimiter=',')
print (df.head(10))
d = []
for dat in df.date:
    # print (dat)
    d.append(datetime.strptime(df['date'], '%Y-%m-%d'))
days = dates.DayLocator()
datemin = datetime(2011, 1, 1)
datemax = datetime(2012, 4, 20) 
fig = plt.figure()
ax = fig.add_subplot(111)
ax.xaxis.set_major_locator(days)
ax.set_xlim(datemin, datemax)
ax.set_ylabel('Count values')

但是我收到了这个错误。

 AttributeError: 'DataFrame' object has no attribute 'date'

我正在尝试将日期绘制为 x 轴,它应该看起来像这样。

谁能帮我将 x 轴绘制为日期列。我会很感激。

【问题讨论】:

  • 您必须将数据框索引设置为日期时间列。见此链接:stackoverflow.com/questions/40815238/…
  • @W.Dodge 我会试一试的。非常感谢
  • @W.Dodge 我将日期列设置为索引,但是值太多,x 轴看起来像一条黑线。我在下面添加图表
  • 对于拥挤的轴,您可以将文本垂直于 x 轴。您还可以设置图形大小以提供更多空间。我正在写一个可能有帮助的答案。
  • @W.Dodge 非常感谢您的帮助

标签: python pandas numpy matplotlib


【解决方案1】:

将索引设置为datetime dtype

如果您通过使用pd.to_datetime(...) 转换日期来将索引设置为日期时间序列,matplotlib 将为您处理 x 轴。

这是一个关于如何处理这种可视化的最小示例。

直接使用pandas.DataFrame.plot 绘图,它使用matplotlib 作为默认后端。

简单示例:

import pandas as pd
import matplotlib.pyplot as plt

date_time = ["2011-09-01", "2011-08-01", "2011-07-01", "2011-06-01", "2011-05-01"]

# convert the list of strings to a datetime and .date will remove the time component
date_time = pd.to_datetime(date_time).date
temp = [2, 4, 6, 4, 6]

DF = pd.DataFrame({'temp': temp}, index=date_time)

ax = DF.plot(x_compat=True, rot=90, figsize=(6, 5))

这将产生如下图:

设置索引让事情变得更简单

重要的一点是,将 DataFrame 索引设置为日期时间序列允许 matplotlib 处理时间序列数据上的 x 轴,而无需太多帮助。

Follow this link for detailed explanation on spacing axis ticks (specifically dates)

【讨论】:

    【解决方案2】:

    您错过了第 12 行 '。它会导致 SyntaxError。

    这应该可以纠正错误。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import datetime
    import matplotlib.dates as mdates
    
    df = pd.read_csv('rio_data.csv', delimiter=',')
    print (df.head(10))
    d = []
    for dat in df.date:
        # print (dat)
        d.append(datetime.strptime(df['date'], '%Y-%m-%d'))
    days = dates.DayLocator()
    datemin = datetime(2011, 1, 1)
    datemax = datetime(2012, 4, 20) 
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.xaxis.set_major_locator(days)
    ax.set_xlim(datemin, datemax)
    ax.set_ylabel('Count values') 
    

    【讨论】:

    • 虽然这是原因,但您不应该回答错字问题。相反,它们应该被关闭并可能添加评论
    • @A.Ben 谢谢我意识到这个愚蠢的错误,但我仍然遇到错误。 AttributeError: 'DataFrame' 对象没有属性 'date' 。我应该在我的问题中更新这个错误吗?
    • 是的,更新吧,我们会尽量解决这个问题,而不是拼写错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多