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