在 matplotlib 中绘制时间与日期

Plotting Time vs Date in matplotlib

我有一个 .csv 文件,其中只有两列,日期和时间:

    04-02-15,11:15
    04-03-15,09:35
    04-04-15,09:10
    04-05-15,18:05
    04-06-15,10:30
    04-07-15,09:20

我需要使用 matplotlib 绘制这些数据(最好是在面积图中,还没到那一步)。我需要 y 轴是时间,x 轴是日期。我无法理解 time/date 的一些用法,希望有人可以查看我的代码并提供一些指导:

import numpy as np
from pylab import *
import matplotlib.pyplot as plt
import datetime as DT

data= np.loadtxt('daily_count.csv', delimiter=',',
         dtype={'names': ('date', 'time'),'formats': ('S10', 'S10')} )

x = [DT.datetime.strptime(key,"%m-%d-%y") for (key, value) in data ]
y = [DT.datetime.strptime(key,"%h:%m") for (key, value) in data]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()


fig.autofmt_xdate()
fig.autofmt_ytime()
plt.plot(x,y)
plt.xlabel('Date')
plt.ylabel('Time')
plt.title('Peak Time')
plt.show()

每次我尝试 运行 它时,我都会收到此错误:

ValueError: time data '04-02-15' does not match format '%h:%m'

我也怀疑 y 轴的刻度线,到目前为止似乎还没有确定。我也非常愿意接受有关此代码其余部分的建议 - 在此先感谢互联网英雄!

所以回溯告诉你问题所在。它试图将您的日期解析为您的时间,这是您在这些行中解析数据的方式的结果:

data= np.loadtxt('daily_count.csv', delimiter=',',
         dtype={'names': ('date', 'time'),'formats': ('S10', 'S10')} )

x = [DT.datetime.strptime(key,"%m-%d-%y") for (key, value) in data ]
y = [DT.datetime.strptime(key,"%h:%m") for (key, value) in data]

解决方法有多种,但'问题的根源;是当您使用 loadtxt 并定义名称和数据类型时,它会返回一个元组列表,即

[('04-02-15', '11:15') ('04-03-15', '09:35') ('04-04-15', '09:10')
('04-05-15', '18:05') ('04-06-15', '10:30') ('04-07-15', '09:20')]

所以当你遍历它时,你实际上是在不断访问日期:

>>> print [key for (key, value) in data]
>>> ['04-02-15', '04-03-15', '04-04-15', '04-05-15', '04-06-15', '04-07-15']

所以您试图将“04-02-15”转换为“%h:%m”格式,这当然行不通。

进入正题,您可以使用 zip 函数消除解析后的数据混淆。例如,

print map(list, zip(*data))
['04-02-15', '04-03-15', '04-04-15', '04-05-15', '04-06-15', '04-07-15']
['11:15', '09:35', '09:10', '18:05', '10:30', '09:20']

此外,您需要检查您传递的日期的格式,例如“%h:%m”将不起作用,因为 %h 不存在,而 %m 表示月份。您可以在文档或此处找到很好的摘要:http://strftime.org/.

或者进入正题:

import numpy as np
from pylab import *
import matplotlib.pyplot as plt
import datetime as DT

data= np.loadtxt('daily_count.csv', delimiter=',',
         dtype={'names': ('date', 'time'),'formats': ('S10', 'S10')} )

dates, times = map(list, zip(*data))
print dates, times

x = [DT.datetime.strptime(date,"%m-%d-%y") for date in dates]
y = [DT.datetime.strptime(time,"%H:%M") for time in times]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()

plt.plot(x,y)
plt.xlabel('Date')
plt.ylabel('Time')
plt.title('Peak Time')
plt.show()

给出了以下情节: