为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2023-09-12 20:03:41
我有一个 S&P500 历史价格数据集,其中包含日期、价格和其他数据,但我现在不需要这些数据来解决我的问题。        Date      Price0     1981.01     6.191     1981.02     6.172     1981.03     6.243     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 等)设置到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")这就是结果,令人相当失望。我的日期应该位于 x 轴上,但问题是该图表与之前的图表不同,而之前的图表是正确的。如果您需要数据集来尝试该问题,您可以在这里找到它。它被称为 1871 年至今的美国股市和 CAPE 比率。希望你已经明白了一切。提前致谢更新我发现了一些可能导致问题的东西。如果您深入查看日期,您可以看到在第 10 个月中,每个日期都被写为浮点数(在原始数据集中),如下所示:示例 Year:1884 1884.1。当您使用pd.to_datetime()将 float 系列转换Date为Datetime. 所以问题可能是 #10 月份的日期转换为 a 时Datetime,变成:(之前的示例)1884-01-01,这是一年中的第一个月,它对最终绘图有影响。解决方案终于,我解决了我的问题!是的,错误是我在 UPDATE 段落中解释的错误,因此我决定添加 a0作为 a,String其中日期(作为字符串)的长度为 6 以便更改,例如: 1884.1 ==> 1884.10df["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_datetimedf["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()
查看完整描述

3 回答

?
慕码人2483693

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 轴均匀地间隔日期。


查看完整回答
反对 回复 2023-09-12
?
暮色呼如

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

输出:

https://img4.sycdn.imooc.com/650054390001d4f006040431.jpg

https://img3.sycdn.imooc.com/6500543f0001a0aa05930448.jpg

查看完整回答
反对 回复 2023-09-12
?
千万里不及你

TA贡献1784条经验 获得超9个赞

我认为你的问题是你的 Date 是 float 类型,并将其作为 x 轴完全符合将此类数组作为([2012.01, 2012.02, ..., 2012.12, 2013.01....])x 轴的预期效果。您可以先将 Date 列转换为 DateTimeIndex,然后使用内置的 pandas 绘图方法:

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


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信