我有一个带有几列的csv文件和一个包含4行的标题。第一列包含时间戳。不幸的是它也给出了毫秒,但是当它们都是00时,文件中没有给出它们。它看起来像是:
"TOA5","CR1000","CR1000","E9048"
"TIMESTAMP","RECORD","BattV_Avg","PTemp_C_Avg"
"TS","RN","Volts","Deg C"
"","","Avg","Avg"
"2015-08-28 12:40:23.51",1,12.91,32.13
"2015-08-28 12:50:43.23",2,12.9,32.34
"2015-08-28 13:12:22",3,12.91,32.54
由于我不需要毫秒,我想摆脱这些,因为这使得包含时间的进一步计算有点复杂。到目前为止我的方法:
提取每行的前20位数,以获得2015-08-28 12:40:23
timestamp = []
with open(filepath) as f:
for _ in xrange(4): #skip 4 header rows
next(f)
for line in f:
time = line[1:20] #Get values for the current line
timestamp.append(time) #Add values to list
从这里开始,我正在努力进一步发展。我想用新创建的timestamp
列表交换csv文件中的第一列。
我尝试创建字典,但我不知道如何使用第2行中的标题标题作为键:
d = {}
with open(filepath, 'rb') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for col in csv_reader:
#use header info from row 2 as key here
这会将整个csv文件导入到dict中,然后我会使用上面的timestamp
列表更改dict中的TIMESTAMP条目。这甚至可能吗?
或者有一种更简单的方法来解决如何使用我的新列表更改csv中的第一列,以便最后我的csv文件包含没有毫秒信息的时间戳?
所以我的csv中的第一列应该是这样的:
"TOA5"
"TIMESTAMP"
"TS"
""
2015-08-28 12:40:23
2015-08-28 12:50:43
2015-08-28 13:12:22
答案 0 :(得分:2)
这应该这样做并保留引用:
with open(filepath1, 'rb') as fin, open(filepath2, 'wb') as fout:
reader = csv.reader(fin)
writer = csv.writer(fout, quoting=csv.QUOTE_NONNUMERIC)
for _ in xrange(4): # copy first 4 header rows
writer.writerow(next(reader))
for row in reader: # process data lines
row[0] = row[0][:19] # strip fractional seconds from first column
writer.writerow([row[0], int(row[1])] + map(float, row[2:]))
由于csv.reader
会将每行的列作为字符串列表返回,因此有必要将包含数字值的任何内容转换为实际的int
或float
数值。重写,以防止他们被引用。
答案 1 :(得分:1)
我相信您可以通过迭代原始csv并根据需要替换时间戳来轻松创建新的csv。
示例 -
with open(filepath, 'rb') as csv_file, open('<new file>','wb') as outfile:
csv_reader = csv.reader(csv_file, delimiter=',')
csv_writer = csv.writer(outfile, delimiter=',')
for i, row in enumerate(csv_reader): #Enumerating as we only need to change rows after 3rd index.
if i <= 3:
csv_writer.writerow(row)
else:
csv_writer.writerow([row[0][1:20]] + row[1:])
答案 2 :(得分:0)
我不完全确定如何解析你的csv,但我会做那样的事情:
time = time.split(".")[0]
所以如果它确实有一毫秒就会被删除,如果没有,那就不会发生任何事情。