3 回答
TA贡献1860条经验 获得超9个赞
最简单的方法是将日期转换为实际的日期时间索引。这种方式matplotlib
会自动拾取它并相应地绘制它。例如,给定您的日期格式,您可以执行以下操作:
df["Date"] = pd.to_datetime(df["Date"].astype(str), format='%Y.%m') df = df.set_index("Date") plt.plot(df["Price"].tail(100))
目前,您显示的第一个图实际上是Price
针对 绘制列index
,这似乎是从 0 - 1800 之类的常规范围索引。您建议您的数据从 1981 年开始,因此尽管每个观测值在 x 轴上均匀分布(间隔为 1,即从一个索引值到下一个索引值的跳跃)。这就是为什么该图表看起来很合理。但 x 轴值却没有。
现在,当您将Date
(作为浮点数)设置为索引时,请注意,您没有均匀地覆盖 1981 年和 1982 年之间的时间间隔。您有 1981.1 - 1981.12 之间均匀间隔的值,但 1981.12 - 1982 之间没有任何值。这就是为什么第二个图表也按预期绘制的原因。DatetimeIndex
如上所述将索引设置为 a应该可以消除此问题,因为 Matplotlib 知道如何沿 x 轴均匀地间隔日期。
TA贡献1853条经验 获得超9个赞
df['Date']
将其视为不是一个好主意float
。它应该转换成 pandas datetime64[ns]
。这可以使用 pandas 方法来实现pd.to_datetime
。
尝试这个:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('ie_data.csv')
df=df[['Date','Price']]
df.dropna(inplace=True)
#converting to pandas datetime format
df['Date'] = df['Date'].astype(str).map(lambda x : x.split('.')[0] + x.split('.')[1])
df['Date'] = pd.to_datetime(df['Date'], format='%Y%m')
df.set_index(['Date'],inplace=True)
#plotting
df.plot() #full data plot
df.tail(100).plot() #plotting just the tail
plt.title("S&P500 Composite Historical Data")
plt.xlabel("Date")
plt.ylabel("Price")
plt.show()
输出:
TA贡献1784条经验 获得超9个赞
我认为你的问题是你的 Date 是 float 类型,并将其作为 x 轴完全符合将此类数组作为([2012.01, 2012.02, ..., 2012.12, 2013.01....])
x 轴的预期效果。您可以先将 Date 列转换为 DateTimeIndex,然后使用内置的 pandas 绘图方法:
df["Price"].tail(100).plot()
添加回答
举报