我(非常)不熟悉编码并尝试自动化一些操作数据的过程,作为我博士的一部分。
我有心率监测器的CSV文件,时间存储为MM:SS.s和当时的心率。 e.g。
Time, Heart_rate
00:00.6, 100
00:01.0, 102
00:01.5, 102
我已使用CSV包导入和DictReader将数据导入数组。
import csv
with open('hr_data.csv', 'rU') as infile:
reader = csv.DictReader(infile, delimiter=',')
数据以字符串形式出现,因此我使用以下代码尝试首先将心率替换为浮点数,然后将时间(例如00:05.5 - 持续5.5秒)转换为浮点数秒。
sec = 0
for row in reader:
row['Heart_rate'] = int(row['Heart_rate'])
temp = row.get('Time')
sec = (float(temp[3:7]) + (float(temp[0:2]) * 60))
row['Time'] = sec
如果我之后打印(行)(一切都是浮点数,时间以秒为单位),这似乎有效。然而,当我向前移动以尝试将数据分成10秒的分档时,所有内容都恢复为原始字符串,我似乎无法做到:
for row in reader:
print(row)
因为这只是打印什么......
提前致谢。
答案 0 :(得分:1)
DO
with open('hr_data.csv', 'rU') as infile:
reader = list(csv.DictReader(infile, delimiter=',’))
它会像你想要的那样工作。
csv.DictReader
是一个生成器。它逐个遍历每一行,完成后就完成了。因为你经历了第一个for
循环中的所有行,所以它已经读取了文件中的所有行,并且是空的。
要保存生成器的结果(存储所有行),请将生成器强制转换为列表。
答案 1 :(得分:0)
是的,你的计算似乎是正确的。但是,一旦离开with
构造的周围,许多物品就会丢失。例如,构建reader
以在此处为您提供标题;它消失了。因为它离开了,所以来自它的row
的值也是如此。你需要安排在循环中保存你想要的东西。
>>> import csv
>>> times = []
>>> heart_rates = []
>>> with open('heart.csv') as heart:
... reader = csv.DictReader(heart, skipinitialspace=True)
... for row in reader:
... temp = row['Time']
... times.append(float(temp[3:7]) + (float(temp[0:2]) * 60))
... heart_rates.append(int(row['Heart_rate']))
...
>>> times
[0.6, 1.0, 1.5]
>>> heart_rates
[100, 102, 102]
更正:在与ddg讨论此问题后,我了解到reader
在with
之外仍然存在。很遗憾,虽然我无法使用reader
重新阅读for row in reader;row
中的行,因为with
文件heart
之外的文件已被关闭。