2

まず、ひどいタイトルをお詫びします。問題を要約する方法がわかりませんでした。さて、これが私の.csvファイルの最初の数行です。最初の列はタイムスタンプです。このデータを1秒間に24回サンプルから取得しているプログラムなので、15:40:15で始まる24行、15:40:16で始まる24行などがあります。同じタイムスタンプを持つ24行の代わりに、タイムスタンプを1/24秒、つまり.042秒ずつ増やしたいと思います。したがって、15:40:15.042、15:40:15.084などです。

もう1つの問題は、最初の1秒間は24行ではないことです。これは、2番目の途中から開始するためです。たとえば、15:40:14の行は13行しかありません。それらの場合、15:40:15.000から逆方向にカウントし、行ごとに.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

csvファイルを開き、http: //docs.python.org/library/csv.htmlに従ってcsvリーダーを作成します

また、 http: //docs.python.org/library/csv.htmlに従ってcsvライターを作成します

次に、ファイルの各行をループします。各行で、タイムスタンプを変更してから、新しいcsvファイルに書き込みます。

新しいcsvファイルで古いcsvファイルを置き換える場合は、最後にshutilhttp://docs.python.org/library/shutil.htmlを使用て置き換えます。

ループ内に「current_timestamp」という変数と「current_increment」という変数を含めることをお勧めします。行のタイムスタンプがcurrent_timestampと等しい場合は、増分を追加するだけです。それ以外の場合は、両方を適切に変更します。

于 2012-08-02T23:35:21.240 に答える
2

同じタイムスタンプを持つ行をグループ化するために使用できる@robertkingの回答に追加します。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
  • Python 2のcsvでは、「b」ファイルモードが必須です。そうでない場合、複数の物理行にまたがる可能性のあるエントリは機能しません。
  • 同じタイムスタンプのエントリが少ない場合n、コードはそれらが1秒の終わりから連続した値であると見なします
于 2012-08-03T00:02:35.240 に答える