【发布时间】:2021-01-12 16:12:00
【问题描述】:
我有一个 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")
这是结果。我使用了df["Price"].tail(100),因此您可以更好地看到第一张图和第二张图之间的差异(稍后您将看到)。
但后来我尝试将索引从前一个(0、1、2 等)设置为 DataFrame 中的df["Date"] 列,以便在 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")
这是结果,非常令人失望。 我有日期,它应该在 x 轴上,但问题是图表与之前的图表不同,而之前的图表是正确的。
如果您需要数据集来尝试问题here,您可以找到它。 它被称为美国股票市场 1871 年至今和 CAPE 比率。 希望你已经明白了一切。 提前致谢
更新
我发现了一些可能导致问题的原因。如果您深入查看日期,您会发现在第 10 个月,每个都写为浮点数(在原始数据集中),如下所示:示例 Year:1884 1884.1。当您使用pd.to_datetime() 将Date 浮点系列转换为Datetime 时,会出现此问题。所以问题可能是 #10 月中的日期在转换为 Datetime 时变为:(之前的示例)1884-01-01 这是一年中的第一个月,并且它对最终情节有影响。
解决方案
终于解决了我的问题!
是的,错误是我在更新段落中解释的错误,所以我决定添加一个0 作为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()
【问题讨论】:
-
如果您需要任何进一步的解释,请随时询问,我会很乐意回复
标签: python pandas dataframe matplotlib data-science