在matplotlib

时间:2015-07-08 01:02:20

标签: python matplotlib graph-visualization

我有一个.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轴是日期。我在处理时间/日期的某些用法时遇到了麻烦,并希望有人可以查看我的代码并提供一些指导:

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轴的嘀嗒声,到目前为止似乎还没有确定。我对此代码的其余部分也提出了建议 - 请提前感谢互联网英雄们!

1 个答案:

答案 0 :(得分:2)

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

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并定义名称和dtypes时,它会返回一个元组列表,即

[('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()

给出了以下情节: enter image description here