2017-11-14 3 views
0

私は年ごとに天気に関する情報を持つcsvファイルを持っています。私は、CSVを最初の列はmm/dd/yyyy形式で日付あるのでPython - ループスルーディクショナリのfindall正規表現として

import csv, re 

with open('weather_data.csv') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter=',') 

csvfile = csvfile.read() 

years = {'year_92': re.findall(r'\d+/\d+/1992', csvfile), 'year_93': re.findall(r'\d+/\d+/1993', csvfile), 
    'year_94': re.findall(r'\d+/\d+/1994', csvfile), 'year_95': re.findall(r'\d+/\d+/1995', csvfile)} 

のように、キーが年であり、値は一年以内にすべての日付を収集するための正規表現で辞書を作成しました2番目は温度です。私がしたいのは、最高の方法を使って1年間にすべての気温を取り、その平均を見つけることです。

現在、私は1992年のすべての気温をリストに追加するために辞書をループしています。そのリストを平均化することができます。

temps = csvfile[1] 
temp_92 = [] 
for line in years.items(), temps: 
    temp_92.append(line) 
    print(temp_92) 

ただし、これは明らかに問題です。コードは実行されますが、mm/dd/yyを戻します。私はcsvfile []を切り替えることを試みたが結果はなかった。ここでは、要求ごとにCSVからのいくつかの例のデータを次のとおりです。ここで

は私の出力が

[dict_items([('year_95', ['1/1/1995', '1/2/1995', '1/3/1995', '1/4/1995', '1/5/1995', '1/6/1995', '1/7/1995', '1/8/1995', '1/9/1995', '1/10/1995', '1/11/1995', '1/12/1995', '1/13/1995', '1/14/1995', '1/15/1995', '1/16/1995', '1/17/1995', '1/18/1995', '1/19/1995', '1/20/1995', '1/21/1995', '1/22/1995', '1/23/1995', '1/24/1995', '1/25/1995', '1/26/1995', '1/27/1995', '1/28/1995', '1/30/1995', '1/31/1995' ...and so on 

EDIT次のようになります!私ができる最高のフォーマットしようとしました。

A1:日付B1:一時
A2:1992年10月1日B2:53
A3:1992年10月2日B3:58
A4:10/3/1992 B4:62

+0

あなたのCSVファイルを数行追加できますか? – Stats4224

+0

CSV行を追加しました – QuestionableWalrus

+0

あなたのCSVを反映するように私の答えを更新しました – Stats4224

答えて

0

あなたの正規表現とcsvの読者はこれに対して過度の攻撃だと思います。あなたの入力形式について私は仮定しましたが、以下はすべて標準のlibararyを使用しています。

入力ファイルの例

A1: Date B1: Temp 
A2: 10/1/1992 B2: 53 
A3: 10/2/1992 B3: 58 
A4: 10/3/1992 B4: 62 

年間例平均電卓:

from itertools import groupby 
from functools import reduce 

csv_file = '/tmp/temp_example.txt' 

with open(csv_file, 'r') as csv_fh: 
    next(csv_fh) # skip header 
    split_lines = [line.strip('\n').split(' ')[1::2] for line in csv_fh] 
    split_lines.sort(key=lambda x: x[0]) # sort by date first 
    # group by year 
    year_temps = {} 
    for key, group in groupby(split_lines, lambda x: x[0].split('/')[-1]): 
     year_temps[key] = [int(row[1]) for row in group] 
    yearly_averages = {year: (reduce(lambda x, y: x + y, temps)/len(temps)) 
         for year, temps in year_temps.items()} 
    print(yearly_averages) 

戦略はここにあなたのラインで、よく読んで開始する彼らの列にそれらを分割され、その後、作成にGROUPBYを使用あなたの年の言葉:[temps]。あなたが最も好むが、平均を計算することができます。

データはかなり構造化されており、実際には年を抽出するための正規表現の複雑さは必要ありません。