2

首先,我为糟糕的标题道歉;我不知道如何总结我的问题。好的,这是我的 .csv 文件的前几行。第一列是时间戳。我每秒从样本中获取此数据的程序 24 次,因此有 24 行以 15:40:15 开头,24 行以 15:40:16 开头,依此类推。我希望时间戳增加 1/24 秒或 0.042 秒的增量,而不是具有相同时间戳的 24 行。所以 15:40:15.042、15:40:15.084 等等。

另一个问题是第一秒没有 24 行,因为我们从第二秒的中间开始。例如,只有 13 个 15:40:14 行。对于那些它最好从 15:40:15.000 倒数并为每一行减去 0.042 秒。

我怎样才能在 Python 中做到这一点?提前致谢!

CPUtime,Displacement Into Surface,Load On Sample,Time On Sample,Raw Load,Raw Displacement
15:40:14,-990.210561,-0.000025,1.7977E+308,-115.999137,-989.210000
15:40:14,-989.810561,-0.000025,1.7977E+308,-115.999105,-988.810000
15:40:14,-989.410561,-0.000025,1.7977E+308,-115.999073,-988.410000
15:40:14,-989.010561,-0.000025,1.7977E+308,-115.999041,-988.010000
15:40:14,-988.590561,-0.000025,1.7977E+308,-115.999007,-987.590000
15:40:14,-988.170561,-0.000025,1.7977E+308,-115.998974,-987.170000
15:40:14,-987.770561,-0.000025,1.7977E+308,-115.998942,-986.770000
15:40:14,-987.310561,-0.000025,1.7977E+308,-115.998905,-986.310000
15:40:14,-986.870561,-0.000025,1.7977E+308,-115.998870,-985.870000
15:40:14,-986.430561,-0.000025,1.7977E+308,-115.998834,-985.430000
15:40:14,-985.990561,-0.000025,1.7977E+308,-115.998799,-984.990000
15:40:14,-985.570561,-0.000025,1.7977E+308,-115.998766,-984.570000
15:40:14,-985.170561,-0.000025,1.7977E+308,-115.998734,-984.170000
15:40:15,-984.730561,-0.000025,1.7977E+308,-115.998698,-983.730000
15:40:15,-984.310561,-0.000025,1.7977E+308,-115.998665,-983.310000
15:40:15,-983.890561,-0.000025,1.7977E+308,-115.998631,-982.890000
15:40:15,-983.490561,-0.000025,1.7977E+308,-115.998599,-982.490000
15:40:15,-983.090561,-0.000025,1.7977E+308,-115.998567,-982.090000
4

2 回答 2

2

我将添加到@robert king 的答案中,您可以使用它itertools.groupby()来对具有相同时间戳的行进行分组:

import csv
import shutil
from itertools import groupby

n = 24
time_increment = 1./n
fractions = [("%.3f" % (i*time_increment,)).lstrip('0') for i in xrange(n)]

with open('input.csv', 'rb') as f, open('output.csv', 'wb') as fout:
     writer = csv.writer(fout)
     # assume the file is sorted by timestamp
     for timestamp, group in groupby(csv.reader(f), key=lambda row: row[0]):
         sametime = list(group) # all rows that have the same timestamp
         assert n >= len(sametime)
         for i, row in enumerate(sametime, start=n-len(sametime)):
             row[0] += fractions[i] # append fractions of a second
         writer.writerows(sametime)

shutil.move('output.csv', 'input.csv') # update input file
  • 'b' 文件模式对于 Python 2 中的 csv 是必需的,否则可能跨越多个物理行的条目将不起作用
  • 如果少于n具有相同时间戳的条目,则代码假定它们是一秒结束后的连续值
于 2012-08-03T00:02:35.240 回答
2

打开 csv 文件并按照http://docs.python.org/library/csv.html创建一个 csv 阅读器

还根据http://docs.python.org/library/csv.html创建一个 csv 编写器

现在循环遍历文件的每一行。在每一行上,修改时间戳,然后将其写入新的 csv 文件。

如果您希望新的 csv 文件替换旧的 csv 文件,最后使用 shutil http://docs.python.org/library/shutil.html替换它。

我建议在你的循环中你有一个名为“current_timestamp”的变量和一个名为“current_increment”的变量。如果行中的时间戳等于 current_timestamp,只需添加增量,否则适当更改它们。

于 2012-08-02T23:35:21.240 回答