【问题标题】:Plotting Time Series with Matplotlib: Using datetime.datetime() works but datetime.datetime.strptime(str, format) does not使用 Matplotlib 绘制时间序列:使用 datetime.datetime() 有效,但 datetime.datetime.strptime(str, format) 无效
【发布时间】:2020-05-12 06:52:19
【问题描述】:

我希望使用 matplotlib 在条形图中绘制一些数据。绘图的 x 值应该是 datetime.datetime 对象,以便 matplotlib 可以使用它们。如果我使用以下方法生成时间值,它会起作用:

import matplotlib.pyplot as plt
import datetime

x = [datetime.datetime(2010, 12, 1, 10, 0),
     datetime.datetime(2011, 1, 4, 9, 0),
     datetime.datetime(2011, 5, 5, 9, 0)]
y = [4, 9, 2]

ax = plt.subplot(111)
ax.bar(x, y, width=10)
ax.xaxis_date()
plt.show()

产生这个情节:

但是,如果我使用以下方法,它不起作用:

import matplotlib.pyplot as plt
import datetime

dates = ["2020-05-11 18:25:37","2020-05-11 18:25:40","2020-05-11 18:25:43",
         "2020-05-11 18:25:46","2020-05-11 18:25:49"]
X = []
for date in dates:
    X.append(datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S'))

Y = [1, 3, 4, 6, 4]


ax = plt.subplot(111)
ax.bar(X, Y, width=10)
ax.xaxis_date()
plt.show()

做出这种可憎的事:

我显然在这里遗漏了一些东西,但在我看来,结果应该是相同的:

datetime.datetime(2010, 12 ,1 ,10, 0)
datetime.datetime.strptime('2010-12-01 10:00:00','%Y-%m-%d %H:%M:%S')

【问题讨论】:

  • 一开始,所有指定的数据都是'2020-05-11',所以X轴是基于天的,所以只有一个条形图。
  • 谢谢你的回复,我明白你的意思了。你知道一种改变 x 轴的方法,使分辨率以秒为单位。

标签: python matplotlib


【解决方案1】:

您可以使用 date2num 将日期转换为 matplotlib 格式。

使用plot_date 绘制日期和值:

X = matplotlib.dates.date2num(X)
matplotlib.pyplot.plot_date(X,Y)
matplotlib.pyplot.show()

或者你可以这样使用

ax.plot_date(X, Y)

【讨论】:

  • 感谢您的回复,我不确定是否可以使用 plot_date() 创建条形图。
【解决方案2】:

由于错误无法显示条形图,而折线图以分钟:秒为单位显示 x 轴。很抱歉帮不了你。

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 import matplotlib.dates as mdates
 import matplotlib.ticker as ticker

 fig = plt.figure(figsize=(8,4.5))
 ax = fig.add_subplot(111)

 dates = ["2020-05-11 18:25:37","2020-05-11 18:25:40","2020-05-11 18:25:43",
     "2020-05-11 18:25:46","2020-05-11 18:25:49"]

 Y = [1, 3, 4, 6, 4]
 df = pd.DataFrame({'Y':Y}, index=pd.to_datetime(dates))

 ax.plot(df.index, df['Y'])

 xloc = mdates.SecondLocator(interval=1)
 xfmt = mdates.DateFormatter("%M:%S")
 ax.xaxis.set_major_locator(xloc)
 ax.xaxis.set_major_formatter(xfmt)
 plt.show()

【讨论】:

  • 您好,非常感谢您的回复。您在评论中所说的仅显示一天的 xaxis 比例是无价的,并为我指明了正确的方向。原来问题出在宽度值上。我希望每 3 秒绘制一次点,但默认宽度是 1 天,所以我不得不将条形的宽度更改为 3 秒,即宽度 = (1/(# 一天中的秒数) * 3)。跨度>
【解决方案3】:

问题是由于 matplotlib 的日期时间宽度必须以 1 天为单位表示。因此,如果宽度 = 1,则条形宽度等于 x 轴上的一天。

通过使宽度等于所用时间刻度的一天百分比来解决此问题,在本例中为 3 秒。例如,如果您希望条形宽度在 x 轴上占据 3 秒,则使宽度等于 3 秒占一整天的百分比,

#NB: There are 86400 seconds in a day and I want a width of 3 seconds. 
ax.plot(width = (1/(86400))*3)

如果您希望条不接触,则应将条的宽度减小到小于 x 轴上绘制的时间戳之间的间隔。此外,如果您希望动态确定时间戳之间的最小间隔,请查看this post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2012-10-04
    • 2021-09-14
    • 2018-12-29
    • 1970-01-01
    相关资源
    最近更新 更多