我使用matplotlib绘制从CSV文件导入的一些数据。这些文件具有以下格式:
Date,Time,A,B
25/07/2016,13:04:31,5,25550
25/07/2016,13:05:01,0,25568
....
01/08/2016,19:06:43,0,68425
日期格式与英国相同,即%d/%m/%Y
。最终结果是有两个图:A
如何随时间变化,以及B
如何随时间变化之一。我是这样导入CSV的数据:
import matplotlib
matplotlib.use('Agg')
from matplotlib.mlab import csv2rec
import matplotlib.pyplot as plt
from datetime import datetime
import sys
...
def analyze_log(file, y):
data = csv2rec(open(file, 'rb'))
fig = plt.figure()
date_vec = [datetime.strptime(str(x), '%Y-%m-%d').date() for x in data['date']]
print date_vec[0]
print date_vec[len(date_vec)-1]
time_vec = [datetime.strptime(str(x), '%Y-%m-%d %X').time() for x in data['time']]
print time_vec[0]
print time_vec[len(time_vec)-1]
datetime_vec = [datetime.combine(d, t) for d, t in zip(date_vec, time_vec)]
print datetime_vec[0]
print datetime_vec[len(datetime_vec)-1]
y_vec = data[y]
plt.plot(datetime_vec, y_vec)
...
# formatters, axis headers, etc.
...
return plt
8月1日之前一切正常。但是,从那以后,matplotlib试图将我的01/08/2016数据点绘制为2016-01-08(1月8日)!
我得到了一个绘图错误,因为它试图从1月到7月进行绘图:
RuntimeError: RRuleLocator estimated to generate 4879 ticks from 2016-01-08 09:11:00+00:00 to 2016-07-29 16:22:34+00:00:
超过Locator.MAXTICKS * 2(2000)
我在这里做错了什么?上面代码中的print语句的结果是:
2016-07-25
2016-01-08 #!!!!
13:04:31
19:06:43
2016-07-25 13:04:31
2016-01-08 19:06:43 #!!!!
答案 0 :(得分:1)
Matplotlib的csv2rec函数已经解析了你的日期,并在解析日期时尝试变得聪明。该函数有两个选项来影响解析,dayfirst
应该有帮助:
dayfirst:默认为False,因此MM-DD-YY优先于DD-MM-YY。
yearfirst:默认为False,因此MM-DD-YY优先于YY-MM-DD。
有关详细信息,请参阅http://labix.org/python-dateutil#head-b95ce2094d189a89f80f5ae52a05b4ab7b41af47。
答案 1 :(得分:0)
您正在使用%d/%m/%Y
格式的字符串,但您已将格式说明符指定为%Y-%m-%d
。