将x轴作为日期绘制

5

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

pandas数据框如下所示

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轴刻度线设置为日期。由于日期列中的最小日期为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轴上绘制日期,效果应该像这样: enter image description here

能否有人帮我将x轴绘制为日期列?非常感谢。


你需要将数据框的索引设置为日期时间列。请参考此链接:https://dev59.com/B1kR5IYBdhLWcg3w0AOy - Dodge
@W.Dodge 我会尝试一下。非常感谢。 - Rio
@W.Dodge 我将日期列设为索引,但是有太多的值使得x轴看起来像一条暗线。我在下面添加了图形。 - Rio
你可以在拥挤的坐标轴上垂直运行文本。你也可以设置图像大小以获得更多空间。我正在撰写一份可能有所帮助的答案。 - Dodge
@W.Dodge 非常感谢您的帮助。 - Rio
2个回答

8

将索引设置为datetime dtype

如果您通过使用pd.to_datetime(...)转换日期将索引设置为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))

下面的代码将生成以下形式的图表:

enter image description here

设置索引使事情更容易

重要的是,将 DataFrame 的索引设置为日期时间序列使 matplotlib 可以处理时间序列数据的 x 轴而不需要太多帮助。

单击此链接以获取有关间隔轴标记(特别是日期)的详细说明。


3

您错过了第12行的',导致了语法错误。

这应该会纠正错误。

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') 

虽然这是原因,但你不应该回答打字错误的问题。相反,它们应该被关闭,并可能添加评论。 - DavidG
@A.Ben 谢谢,我意识到了那个愚蠢的错误,但是我还是遇到了一个问题。AttributeError: 'DataFrame'对象没有属性'date'。我应该在我的问题中更新这个错误吗? - Rio
是的,请更新它。我们会尝试解决这个问题,而不是排版错误。 - AdriBento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接