索引转换为熊猫日期时间后,绘图图表是一团糟

Posted

技术标签:

【中文标题】索引转换为熊猫日期时间后,绘图图表是一团糟【英文标题】:Plotly chart is a mess of lines after index converted to pandas datetime 【发布时间】:2021-10-27 00:33:27 【问题描述】:

我的图表只是一团曲折的线(see chart here)。这只发生在我使用df['Date'] = pd.to_datetime(df.index) 将索引转换为日期时间格式之后。

完整代码:

#IMPORTS
import yfinance as yf
import time
import pandas as pd
import datetime
import numpy as np
import xlsxwriter
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# SETTING UP DF
df = ((pd.read_csv('Book1.csv')).set_index('Date'))[:-1]
df['SMA30'] = df.Total.rolling(30).sum()
df['SMA365'] = df.Total.rolling(365).sum()
df['Monthly Avg'] = df.SMA30.mean()
df['Date'] = pd.to_datetime(df.index)

# PLOTTING FIGURE
fig = go.Figure()
fig.update_layout(title = 'EQ Footfall')
fig.add_trace(go.Scatter(x=df['Date'], y=df.Total, name = 'Footfall Daily'))
fig.add_trace(go.Scatter(x=df.index, y=df.SMA30, name = 'SMA30'))
fig.add_trace(go.Scatter(x=df.index, y=df.SMA365, name = 'SMA365'))
fig.update_xaxes(rangeslider_visible=True)
fig.update_xaxes(tickangle=-45)

【问题讨论】:

数据集有什么帮助;) df = pd.DataFrame("Date":pd.date_range("1-jan-2010", periods=365*10).astype(str), "Total":np.random.randint(1,5, 365*10)).set_index("Date") 而不是 read_csv() 绘图正确。显然我无权访问您的 CSV,但我怀疑您的数据框中存在数据问题 我怀疑对索引进行排序会有所帮助。 df.sort_index() @ShanGovind 请按照here 的说明分享您的数据样本。并确保您提供完整的代码 sn-p 来重现您的问题。 谢谢@Oddaspa 您的建议有助于解决问题。我将在下面重新发布它作为答案并感谢您。 【参考方案1】:

@Oddaspa 的建议也对我有用:

对索引进行排序会有所帮助。 df.sort_index()

【讨论】:

【参考方案2】: 数据框索引中的日期顺序很重要 以 YYYYMMDD 格式不按顺序模拟日期 没有这条线 df = df.reindex(df.sort_index().index),生成的绘图是在 x 和 y 坐标之间绘制线,其中 x 不是连续的 当日期是一个字符串时,它是一个分类的,所以它的行为与连续变量不同
import yfinance as yf
import time
import pandas as pd
import datetime
import numpy as np
import xlsxwriter
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# SETTING UP DF
# df = ((pd.read_csv('Book1.csv')).set_index('Date'))[:-1]
df = pd.DataFrame("Date":pd.Series(pd.date_range("1-jan-2018", periods=int(365*2.5))).dt.strftime("%Y%m%d"), 
                   "Total":np.random.randint(1,5, int(365*2.5))).set_index("Date")
# simulate dates in none sequential order
np.random.shuffle(df.index.values)
# reindex with sequential dates,  NB dates or format YYYYMMDD are sortable in this way
df = df.reindex(df.sort_index().index)
df['SMA30'] = df.Total.rolling(30).sum()
df['SMA365'] = df.Total.rolling(365).sum()
df['Monthly Avg'] = df.SMA30.mean()
df['Date'] = pd.to_datetime(df.index)
# df["Date"] = df.index

# PLOTTING FIGURE
fig = go.Figure()
fig.update_layout(title = 'EQ Footfall')
fig.add_trace(go.Scatter(x=df['Date'], y=df.Total, name = 'Footfall Daily'))
fig.add_trace(go.Scatter(x=df.index, y=df.SMA30, name = 'SMA30'))
fig.add_trace(go.Scatter(x=df.index, y=df.SMA365, name = 'SMA365'))
fig.update_xaxes(rangeslider_visible=True)
fig.update_xaxes(tickangle=-45)

【讨论】:

以上是关于索引转换为熊猫日期时间后,绘图图表是一团糟的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中将索引转换为日期时间

如何在熊猫中将索引转换为日期时间?

Python:将日期的天数设置为绘图的索引

更改熊猫中日期时间列的时区并添加为分层索引

熊猫数据框索引 datetime.date 转换为对象 KeyError

熊猫以时间为索引获取特定日期的行数