2012-03-30 21 views
0

こんにちは私はPythonの新しいユーザーです。私が想像していたことはかなり基本的な作業でした。毎月の平均データを集計するための集計データ

私は毎日の積雪深度データを含むいくつかの(> 50)csvファイルを持っています。私はcsvファイルを繰り返して、積雪量の月平均を計算したいと思います。データ例:私は毎月の積雪深の平均値を計算し、新しいCSVファイルへの出力を書きたい言い換えれば

Date,SD 
1/1/2000,36 
1/2/2000,36 
1/3/2000,38 
1/4/2000,40 
2/1/2000,48 
2/2/2000,48 

。私はデータのコードの別の例を変更することができましたが、私の辞書のキー値として日付を使用するためのキーエラーを受け取りました。

アドバイスはありますか?

コードこれまで:

from __future__ import division 
import csv 
from collections import defaultdict 

def default_factory(): 
    return [0, None, None, 0] 

reader = csv.DictReader(open(r'C:\SandBox\VALIDATION\TestTable.csv')) 

dates = defaultdict(default_factory) 
for row in reader: 
    sd = int(row["SD"]) 
    dates[row["Dates"]][0] += sd 
    max = dates[row["Dates"]][1] 
    dates[row["Dates"]][1] = amount if max is None else amount if amount > max else max 
    min = dates[row["Date"]][2] 
    dates[row["Dates"]][2] = amount if min is None else amount if amount < min else min 
    dates[row["Dates"]][3] += 1 

for date in dates: 
    dates[date][3] = dates[date][0]/dates[date][3] 

writer = csv.writer(open(r'C:\SandBox\VALIDATION\TestAvg.csv', 'w', newline = '')) 
writer.writerow(["Date", "SD", "max", "min", "mean"]) 
writer.writerows([date] + dates[date] for date in dates) 

EDIT:だけ明確にする、私はすなわち、1月1つの日付の平均を計算していない...など、2月が意味する、意味、毎月の総平均値を達成しようとしています。 Dateが列名であるようにあなたは、データのあなたの例から、(例えばmin = dates[row["Date"]][2])それはDateあるカラム名(例えばmax = dates[row["Dates"]][1])、および他の場所としてDatesを使用していた

+2

stacktrace/error全体を投稿できますか? – jgritty

+2

中央値ではなく平均を計算する場合、なぜ最小値と最大値を気にしますか? – jgritty

+1

日付、雪の深さまたは日付、SD? – WolframH

答えて

0

あなたはコードが少し読みやすくするために辞書を使用する場合があります。

from __future__ import division 
import csv 
from collections import defaultdict 

def default_factory(): 
    return { "sum": 0, "max": None, "min": None, "count": 0} 

reader = csv.DictReader(open(r'sd.csv')) 

dates = defaultdict(default_factory) 
rows = [] 
for row in reader: 
    date = row["Date"] 
    sd = int(row["Snowdepth"]) 
    rows.append([date, sd]) 
    month = date.split("/")[0] 
    r = dates[month] 
    r["sum"] += sd 
    max = r["max"] 
    r["max"] = sd if max is None else sd if sd > max else max 
    min = r["min"] 
    r["min"] = sd if min is None else sd if sd < min else min 
    r["count"] += 1 

for date in dates: 
    r = dates[date] 
    r["avg"] = r["sum"]/r["count"] 

writer = csv.writer(open(r'TestAvg.csv', 'w')) 
writer.writerow(["Date", "SD", "max", "min", "mean"]) 
for row in rows: 
    r = dates[row[0].split("/")[0]] 
    writer.writerow(row + [r["max"], r["min"], r["avg"]]) 
+0

ありがとうGebb、かなりうまくいった! –

0

Someplacesに見えますか?だからどこでも同じ名前を使用すればOKです。

s="""Date,Snowdepth 
1/1/2000,36 
1/2/2000,36 
1/3/2000,38 
1/4/2000,40 
2/1/2000,48 
2/2/2000,48""" 

import StringIO 
import csv 
reader = csv.DictReader(StringIO.StringIO(s)) 

for row in reader: 
    print row['Date'] 

出力:

1/1/2000 
1/2/2000 
1/3/2000 
1/4/2000 
2/1/2000 
2/2/2000 
0
from __future__ import division 
import csv 
from collections import defaultdict 

def default_factory(): 
    return [0, None, None, 0] 

reader = csv.DictReader(open(r'snow_data.csv')) 

dates = defaultdict(default_factory) 

for row in reader: 
    amount = int(row["Snowdepth"]) 
    dates[row["Date"]][0] += amount 
    max = dates[row["Date"]][1] 
    dates[row["Date"]][1] = amount if max is None else amount if amount > max else max 
    min = dates[row["Date"]][2] 
    dates[row["Date"]][2] = amount if min is None else amoun if amount < min else min 
    dates[row["Date"]][3] += 1 


for date in dates: 
    dates[date][3] = dates[date][0]/dates[date][3] 

writer = csv.writer(open(r'TestAvg.csv', 'w')) 
writer.writerow(["Date", "Snowdepth", "max", "min", "mean"]) 
writer.writerows([date] + dates[date] for date in dates) 

私はあなたのサンプルのCSVが提供するものである、とどこでもDateSnowdepthを使用するようにコードを修正しました。また、変数amountは、sdであることを意図していました。それ以外の場合、金額は定義されていません。私はそれをどこにでも作った。amount

単一の日付に複数のエントリがない限り、非常にエキサイティングな結果は得られません。

たとえば、ここにあなたのサンプルCSVからの出力は次のとおりです。

Date,Snowdepth,max,min,mean 

1/3/2000,38,38,38,38.0 

2/2/2000,48,48,48,48.0 

2/1/2000,48,48,48,48.0 

1/4/2000,40,40,40,40.0 

1/1/2000,36,36,36,36.0 

1/2/2000,36,36,36,36.0 
+0

私はあなたが私の質問を誤解したと思う。私は月平均(36.6667の1月平均)を達成したいと思います。 –

+0

ああ、私は完全にその部分を逃した。 – jgritty

関連する問題