用修改的列替换csv中的列

时间:2015-09-12 16:30:32

标签: python list python-2.7 python-3.x

我有一个带有几列的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

3 个答案:

答案 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会将每行的列作为字符串列表返回,因此有必要将包含数字值的任何内容转换为实际的intfloat数值。重写,以防止他们被引用。

答案 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]

所以如果它确实有一毫秒就会被删除,如果没有,那就不会发生任何事情。