Python 如何将具有日期索引和int值元组的csv文件转换为适合打印的dict?
以下是csv数据的示例:Python 如何将具有日期索引和int值元组的csv文件转换为适合打印的dict?,python,matplotlib,Python,Matplotlib,以下是csv数据的示例: Timestamp,Systolic,Diastolic,Pulse 201711051037,135,81,62 201711061614,121,74,60 201711150922,129,74,70 201711170901,135,80,65 我正在使用Python 3.6.8和此脚本创建dict: from csv import DictReader as dict_reader d = dict() with open(CSV_FILE, 'r')
Timestamp,Systolic,Diastolic,Pulse
201711051037,135,81,62
201711061614,121,74,60
201711150922,129,74,70
201711170901,135,80,65
我正在使用Python 3.6.8和此脚本创建dict:
from csv import DictReader as dict_reader
d = dict()
with open(CSV_FILE, 'r') as csvfile:
reader = dict_reader(csvfile)
ts, sy, dia, p = next(reader)
for r in reader:
d[r[ts]] = int(r[sy]), int(r[dia]), int(r[p])
结果是:
{'201711051037':(135,81,62),'201711061614':(121,74,60),'201711150922':(129,74,70),'201711170901':(135,80,65)}
我想将结果转换成一种可以与Matplotlib plot一起使用的形式。可能是这样的:
Timestamp = [201711051037, 201711061614, 201711150922, 201711170901]
Systolic = [135, 121, 129, 135]
Diastolic = [81, 74, 74, 80]
Pulse = [62, 60, 70, 65]
为了使用Matplotlib创建线图并使用填充和其他功能,我认为数据需要在单独的列表中。我尝试过不同的方法,比如:
index = list(d.keys())
data = list(d.values())
sy = [data[i][j] for i in data for j in data]
并研究了这些类似的问题:
然而,我被困在这一点上。如有任何提示或指示,将不胜感激。谢谢。从您希望输出的外观开始:
Timestamp = [201711051037, 201711061614, 201711150922, 201711170901]
Systolic = [135, 121, 129, 135]
Diastolic = [81, 74, 74, 80]
Pulse = [62, 60, 70, 65]
您可以从以下网站获得这些信息:
Timestamp = [int(stamp) for stamp in d.keys()]
Systolic = [value[0] for value in d.values()]
Diastolic = [value[1] for value in d.values()]
Pulse = [value[2] for value in d.values()]
如果您对替代解决方案感兴趣,可以使用
*
解压字典值,然后使用zip
获得三个不同的列表。在这里,我使用map
将输出转换为列表,这正是您想要的
dic = {'201711051037': (135, 81, 62), '201711061614': (121, 74, 60),
'201711150922': (129, 74, 70), '201711170901': (135, 80, 65)}
Timestamp = list(map(int, dic.keys()))
Systolic, Diastolic, Pulse = map(list, zip(*dic.values()))
print (Timestamp)
print (Systolic)
print (Diastolic)
print (Pulse)
# [201711051037, 201711061614, 201711150922, 201711170901]
# [135, 121, 129, 135]
# [81, 74, 74, 80]
# [62, 60, 70, 65]
此外,如果必须只打印它们,则不需要将值转换为列表
Timestamp = list(map(int, dic.keys()))
Systolic, Diastolic, Pulse = zip(*dic.values())
plt.plot(Timestamp, Systolic, label='Systolic')
plt.plot(Timestamp, Diastolic, label='Diastolic')
plt.plot(Timestamp, Pulse, label='Pulse')
plt.legend()
您需要创建中间词典吗?为什么不直接将数据放入列表?@DobroIRM,使用csv阅读器和切片直接创建列表?听起来好像行得通,我试试看。谢谢。谢谢你提供的有用信息。这些Python习语非常简洁。作为一名初级程序员,我很高兴被介绍给他们。