【问题标题】:Time series Python Plot (Axes mismatch)时间序列 Python 图(轴不匹配)
【发布时间】:2018-06-24 16:20:13
【问题描述】:

我创建了一个 Pandas 数据框,并使用 pd.to_datetime 函数将“日期”列转换为时间序列对象。我试图在 Python 和 Excel 中绘制相关图,以查看时间戳是否正确映射。

第一个绘图是一个 Excel 绘图,其中时间映射到点。 我试图在 Python 中复制这一点 - 仅使用“观察”,该图反映了 Excel 图。然而,一旦我添加了“日期”,情节就变成了意大利面条情节。

我似乎无法弄清楚为什么会这样 - 任何人都可以提供建议吗?

我在日期字段中使用了以下行:

CNN006['Date'] = pd.to_datetime(CNN006['Date'])

这正确地将日期转换为时间戳(图 4)

请参考附件:

csv 文件的链接在这里: https://drive.google.com/open?id=1kctGhXafHYXxC1rSFvdwgvmvLAo2RLsZ

编辑 - 我尝试了另一种修改 xticks 的方法,但结果好坏参半,没有给我想要的东西

from matplotlib.dates import DateFormatter
fig, ax = plt.subplots()
plt.xticks(rotation=90)
myFmt = DateFormatter("%Y-%m-%d")
ax.xaxis.set_major_formatter(myFmt)

编辑 这是图 2 和图 3 的代码 **情节2

fig, ax = plt.subplots()
plt.xticks(rotation=45)
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.grid()
plt.xticks(rotation=90)
ax.plot(CNN006.Date,CNN006.DailyAvgGasFlowRate)
ax.plot(CNN006.Date,CNN006.DailyAvgWaterRate)
ax.plot(CNN006.Date, CNN006.DailyAvgTorque)

*情节 3

fig, ax = plt.subplots()
plt.xticks(rotation=45)
xfmt = mdates.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.grid()
plt.xticks(rotation=90)
ax.plot(CNN006.DailyAvgGasFlowRate)
ax.plot(CNN006.DailyAvgWaterRate)
ax.plot(CNN006.DailyAvgTorque)

解决方案

CNN006['Date'] = pd.to_datetime(CNN006['Date'], format='%d-%m-%Y %H:%M:%S')
ax = CNN006.set_index('Date').plot()
xfmt = mdates.DateFormatter('%d-%m-%Y %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.xticks(rotation=90)

我之前假设使用 .to_date 功能,它会自动将日期字符串转换为适当的时间序列,而无需明确要求传入格式。我现在意识到情况并非如此,我们必须指定格式在 .to_date 函数中,以便 MatPlotLib 不会与与用户指定的“日期”操作不匹配的传入日期混淆(即我的代码中的 xmft)。

【问题讨论】:

  • 能否请您发布用于绘制图 2 和图 3 的代码?
  • @ThomasKühn - 我已经用我的代码更新了这个问题。谢谢。
  • 由于to_datetime() 没有提供格式字符串,日期解析器对格式进行了假设。具体来说,它尝试了“MM/DD/YYYY”,如果失败了,它会尝试“DD/MM/YYYY”。因此,结果数据框中的前三行具有Date“2016 年 11 月 1 日;2016 年 12 月 1 日;2016 年 1 月 13 日”。 Matplotlib 按 Dataframe 的顺序绘制这些图,并连接线(因此第三个数据点似乎及时跳回——因此是“意大利面条”)。对 Matplotlib 的 set_major_formatter 的调用仅控制日期在 xaxis 上的打印方式,这是正确完成的。

标签: python pandas matplotlib plot time-series


【解决方案1】:

我认为您的问题与数据的日期格式有关。如果您向to_datetime() 提供格式字符串,您应该已准备就绪。

df = pd.read_csv('MatplotLibTSManipulation.csv')
df.Date = pd.to_datetime(df.Date, format='%d-%m-%Y %H:%M:%S')
ax = df.set_index('Date').plot()

【讨论】:

  • 感谢您的建议。我更新了基于您提供的答案的答案。我希望我的数据在 pandas 中的解析方式会自动应用指定的数据格式,但事实并非如此。我们必须手动指定格式类型才能起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2019-10-05
  • 2013-02-26
相关资源
最近更新 更多