当我更改 python pandas dataframe 中的索引时

我有一个 S&P500 历史价格数据集,其中包含日期、价格和其他数据,但我现在不需要这些数据来解决我的问题。


        Date      Price

0     1981.01     6.19

1     1981.02     6.17

2     1981.03     6.24

3     1981.04     6.25

.       .           .

and so on till 2020

日期由float年份、点和月份组成。


我尝试用 绘制所有历史价格matplotlib.pyplot as plt。


plt.plot(df["Price"].tail(100))

plt.title("S&P500 Composite Historical Data")

plt.xlabel("Date")

plt.ylabel("Price")

https://img.mukewang.com/650053ca0001979f03930273.jpg

这就是结果。我使用它是df["Price"].tail(100)为了让您可以更好地看到第一张图和第二张图之间的差异(您很快就会看到)。


但后来我尝试将索引从之前的索引(0、1、2 等)设置到df["Date"]DataFrame 中的列,以便查看 x 轴中的日期。


df = df.set_index("Date")

plt.plot(df["Price"].tail(100))

plt.title("S&P500 Composite Historical Data")

plt.xlabel("Date")

plt.ylabel("Price")

https://img4.mukewang.com/650053d80001c14803940277.jpg

这就是结果,令人相当失望。我的日期应该位于 x 轴上,但问题是该图表与之前的图表不同,而之前的图表是正确的。

如果您需要数据集来尝试该问题,您可以在这里找到它。它被称为 1871 年至今的美国股市和 CAPE 比率。希望你已经明白了一切。提前致谢

更新

我发现了一些可能导致问题的东西。如果您深入查看日期,您可以看到在第 10 个月中,每个日期都被写为浮点数(在原始数据集中),如下所示:示例 Year:1884 1884.1。当您使用pd.to_datetime()将 float 系列转换DateDatetime. 所以问题可能是 #10 月份的日期转换为 a 时Datetime,变成:(之前的示例)1884-01-01,这是一年中的第一个月,它对最终绘图有影响。

解决方案

终于,我解决了我的问题!是的,错误是我在 UPDATE 段落中解释的错误,因此我决定添加 a0作为 a,String其中日期(作为字符串)的长度为 6 以便更改,例如: 1884.1 ==> 1884.10

df["len"] = df["Date"].apply(len)

df["Date"] = df["Date"].where(df["len"] == 7, df["Date"] + "0")

然后我删除刚刚创建的 len 列。


df.drop(columns="len", inplace=True)

最后我将“日期”更改Datetime为pd.to_datetime


df["Date"] = pd.to_datetime(df["Date"], format='%Y.%m')

df = df.set_index("Date")

然后我绘制


df["Price"].tail(100).plot()

plt.title("S&P500 Composite Historical Data")

plt.xlabel("Date")

plt.ylabel("Price")

plt.show()


炎炎设计
浏览 120回答 3
3回答

慕码人2483693

最简单的方法是将日期转换为实际的日期时间索引。这种方式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 轴均匀地间隔日期。

暮色呼如

df['Date']将其视为不是一个好主意float。它应该转换成 pandas datetime64[ns]。这可以使用 pandas 方法来实现pd.to_datetime。尝试这个:import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_csv('ie_data.csv')df=df[['Date','Price']]df.dropna(inplace=True)#converting to pandas datetime formatdf['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)#plottingdf.plot() #full data plotdf.tail(100).plot() #plotting just the tailplt.title("S&P500 Composite Historical Data")plt.xlabel("Date")plt.ylabel("Price")plt.show()输出:

千万里不及你

我认为你的问题是你的 Date 是 float 类型,并将其作为 x 轴完全符合将此类数组作为([2012.01, 2012.02, ..., 2012.12, 2013.01....])x 轴的预期效果。您可以先将 Date 列转换为 DateTimeIndex,然后使用内置的 pandas 绘图方法:df["Price"].tail(100).plot()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python