【发布时间】: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