这是我将如何解决它:
- 阅读 csv 文件。这可以使用
csv
python 的模块来完成
- 根据您的 bin 大小读取和/或转换日期戳,并遍历每一行,添加到正确的小时 bin。我只是用肮脏的方式来做,减少分钟和秒:
row[0][:-5]
返回15/07/2015 11
,一个日期和小时。
你最终会得到一个status_records
包含两个 dicts 的列表,代表两个状态选项,然后包含小时箱:
"1" : {"15/07/2015 11": 3, ...}
"-11" : {"15/07/2015 11": 0, ...}
这是一个data.csv
包含更多数据的示例(这样您就可以实际看到一些东西,这对于您的 2 个条目来说很难 - 我使用的是相同的日期格式和您提到的状态代码):
start_time,exit_status
15/07/2015 11:53:47,1
15/07/2015 11:53:47,1
15/07/2015 11:54:56,1
15/07/2015 12:23:26,-11
15/07/2015 12:27:31,1
15/07/2015 14:01:47,-11
15/07/2015 14:11:56,1
15/07/2015 14:52:47,1
15/07/2015 15:53:23,1
15/07/2015 15:55:11,1
这是我的代码(您必须将row[0]
等更改为相应的行才能使用您的 csv):
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
import csv
# 1. reading the csv
status_records = {'1': {}, '-11': {}}
with open('data.csv', 'rb') as csvfile:
reader = csv.reader(csvfile)
# 2. iterate through csv
for row in reader:
if row[0] == 'start_time': continue # first line
hour = row[0][:-5]
status = row[1]
# if hour not present, add empty 'slot' in each status bin
if hour not in status_records[status].keys():
status_records['1'][hour] = 0
status_records['-11'][hour] = 0
status_records[status][hour] = 1 # add the status we just read
else:
status_records[status][hour] += 1 # update status-hour bin
status1 = status_records['1'].values()
status2 = status_records['-11'].values()
print status1, status2
N = len(status1)
ind = np.arange(N)
width = 0.35
p1 = plt.bar(ind, status1, width, color='g')
p2 = plt.bar(ind, status2, width, color='r', bottom=status1)
plt.ylabel('# of exit status')
plt.title('Exit status in comparison with time')
plt.yticks(np.arange(0,11,10))
plt.legend((p1[0], p2[0]), ('1', '-11'))
plt.show()
输出:
改进:您可能想要添加一些有用的标签,并决定是否显示没有发生任何事情的时间(这可能会使图表变得混乱)。另外,请注意,日期应按原样在 csv 中排序,否则您必须自己在代码中对其进行排序。
无论如何,这应该给你一些开始。