2011-11-10 35 views
0

私は10秒ごとに記録された日時と値を持つ大きなcsvファイルを持っています。 csvファイルは次のようになります。分平均csvファイル

 
Datetime    Data 
2008-10-01 12:00:00, 40.67 
2008-10-01 12:01:00, 111.33 

任意のアイデアどのようにこれを行うことができます

 
Datetime    Data 
2008-10-01 12:00:10, 34 
2008-10-01 12:00:20, 55 
2008-10-01 12:00:30, 46 
2008-10-01 12:00:40, 33 
2008-10-01 12:00:50, 55 
2008-10-01 12:01:00, 21 
2008-10-01 12:01:10, 2 
2008-10-01 12:01:20, 34 
2008-10-01 12:01:30, 521 
2008-10-01 12:01:40, 45 
2008-10-01 12:01:50, 32 
2008-10-01 12:02:00, 34 

私は分の平均値を計算し、次の出力を与える新しいCSVファイルでそれを書くと、スクリプトを書きたいです私が調べなければならないモジュールや何かの例についての示唆があります。

+0

あなたはどのスクリプト言語を使用していますか?これは多くの言語で、さらにはそれ自身でも優れています。プラットフォームまたは優先言語に関するガイダンスをお伝えください。お手伝いができます。 – dan360

+0

@ dan360質問はタグ付きPythonです。 – agf

+0

なぜ私はPythonを勉強していますが、これをPythonでやりたかったのですが、読んでみるべきモジュールについて質問しました。 – Navin

答えて

1

csv.readerを使用してファイルと辞書を解析し、結果をクラスタ化します。 str.rpartitionメソッドは、秒を分割できます。平均値を計算するためにsumlen使用します。

data = '''\ 
2008-10-01 12:00:10, 34 
2008-10-01 12:00:20, 55 
2008-10-01 12:00:30, 46 
2008-10-01 12:00:40, 33 
2008-10-01 12:00:50, 55 
2008-10-01 12:01:00, 21 
2008-10-01 12:01:10, 2 
2008-10-01 12:01:20, 34 
2008-10-01 12:01:30, 521 
2008-10-01 12:01:40, 45 
2008-10-01 12:01:50, 32 
2008-10-01 12:02:00, 34 
'''.splitlines() 

import csv 

d = {} 
for timestamp, value in csv.reader(data): 
    minute, colon, second = timestamp.rpartition(':') 
    if minute not in d: 
     d[minute] = [float(value)] 
    else: 
     d[minute].append(float(value)) 

for minute, values in sorted(d.items()): 
    avg_value = sum(values)/len(values) 
    print minute + ',' + str(avg_value) 
+0

なぜ 'defaultdict'や' setdefault'はありませんか?なぜOrderedDictを使うのではなく、注文を失って再構築するのですか? – agf

+1

これは私の自然な選択でしたが、これは初心者の質問ですので、単純なPython(平易なdicts、文字列メソッド、型キャスト、フォーマットされていないプリント、各行の最小ステップ数)を必要とします。 –

2

最も簡単な方法は、時間ではなく、文字列として時間を扱い、そして使用するだけであるように思えるitertools.groupby

from csv import reader 
from itertools import groupby 

lines = """Datetime    Data 
2008-10-01 12:00:10, 34 
2008-10-01 12:00:20, 55 
2008-10-01 12:00:30, 46 
2008-10-01 12:00:40, 33 
2008-10-01 12:00:50, 55 
2008-10-01 12:01:00, 21 
2008-10-01 12:01:10, 2 
2008-10-01 12:01:20, 34 
2008-10-01 12:01:30, 521 
2008-10-01 12:01:40, 45 
2008-10-01 12:01:50, 32 
2008-10-01 12:02:00, 34""" 

lines = iter(lines.splitlines()) 

# above this is just for testing, really you'd do 
# with open('filename', 'rb') as lines: 
# and indent the rest 

next(lines) 

for minute, group in groupby(reader(lines), lambda row: row[0][:16]): 
    group = list(group) 
    print minute, sum(float(row[1]) for row in group)/len(group)