2016-10-11 16 views
-1

2秒ごとにファイルを保存するエネルギー測定デバイスからのディレクトリに多数の.csvファイルがあります。 各ファイルには、そのようになります(測定が停止した場合)ディレクトリ内の複数のcsvファイルのデータを分割してマージ

Position,Date,Time,V12,Unit,V23,Unit,V31,Unit,A1,Unit,A2,Unit,A3,Unit,P(SUM),Unit,S(SUM),Unit,Q(SUM),Unit,PF(SUM),Unit,PFH,Unit,WH,Unit,SH,Unit,QH,Unit,FREQ,Unit 
0,7/21/2016,23:59:56,392.5, ACV,394, ACV,393.2, ACV,1.053, ACA,1.045, ACA,0, ACA,0.367,KW ,0.432,KVA ,0.229,KVAR,0.84,,0.85,,854.6,KWH ,1,MVAH ,516.8,KVARH ,50,Hz 
0,7/21/2016,23:59:58,392.6, ACV,394.1, ACV,392.9, ACV,1.053, ACA,1.048, ACA,0, ACA,0.368,KW ,0.433,KVA ,0.229,KVAR,0.84,,0.85,,854.6,KWH ,1,MVAH ,516.8,KVARH ,50,Hz 
0,7/22/2016,0:00:00,392.5, ACV,394, ACV,392.5, ACV,1.049, ACA,1.042, ACA,0, ACA,0.366,KW ,0.431,KVA ,0.228,KVAR,0.84,,0.85,,854.6,KWH ,1,MVAH ,516.8,KVARH ,49.9,Hz 
0,7/22/2016,0:00:02,392.1, ACV,393.5, ACV,392.1, ACV,1.047, ACA,1.039, ACA,0, ACA,0.363,KW ,0.428,KVA ,0.226,KVAR,0.84,,0.85,,854.6,KWH ,1,MVAH ,516.8,KVARH ,50,Hz 

は、時には一日だけは時々2日以上、ファイル内にあります。時々、データの間に見出しがあります(測定が停止し、再び開始されたとき)。 各ファイルは30000行で構成され、データは昇順でソートされます。

日付ごとに名前が付けられた1日ごとに1つのファイルを作成します。この例では、2016-07-21.csvとなります(2番目の列に日付が表示されます)。ファイルは上記の見出しの行から始まる必要があります。

サンプルファイルは、ここで見つけることができます: Sample files

は、仕事を得るためにそこにスクリプトですか?

+1

はい、ありますが、何か試しましたか? – MMF

+0

私は似たようなことをするスクリプトがあることを望んでいました。私はgithubの上を覆った。しかし何も見つけられなかった。 私はスクリプトに熟練していないので、私はちょうど私が変更することができるスクリプトが存在すると推測しました... –

+0

それは難しくないので、あなたは1つを見つけることができないかもしれません。それはちょうどコードの行ですので、そのためのスクリプトを行う必要はありません。 'pandas'を使用してください – MMF

答えて

2

次のアプローチは、あなたが始める必要があります。

from datetime import datetime 
from collections import defaultdict 
import csv 
import glob 

days = defaultdict(list) 

for filename in glob.glob('*.csv'): 
    with open(filename, 'rb') as f_input: 
     csv_input = csv.reader(f_input) 
     header = next(csv_input) 

     for row in csv_input: 
      if row[0] != "Position": 
       day = datetime.strptime('{} {}'.format(row[1], row[2]), '%m/%d/%Y %H:%M:%S') 
       days[row[1]].append([day, row]) 

for day in sorted(days.keys()): 
    with open('/myoutputfolder/{}.csv'.format(days[day][0][0].strftime('%Y-%m-%d')), 'wb') as f_output: 
     csv_output = csv.writer(f_output) 
     csv_output.writerow(header) 
     csv_output.writerows(row for dt, row in sorted(days[day], key=lambda x: x[0])) 

これは、CSVファイルのすべてを読み込み、エントリをソートして、別のcsvファイルに毎日書き出します。 Python defaultdictを使用して、毎日のエントリのリストを保持します。また、日付と時刻の列をPython datetimeに変換するので、出力ファイルに書き込む前にエントリをすべて正しくソートすることができます。 globライブラリは、指定されたフォルダに対して.csvファイルのリストを返すためにのみ使用されます。サブフォルダが必要な場合は、os.walk()に変換する必要があります。 csvライブラリは、csvファイルをリストに自動的に読み込むために使用されます。

Python 2.7.12でテスト済み

+0

マーティンありがとう。 私はあなたのスクリプトを試しましたが、それは14行目で停止します: 'ValueError:時刻データが日付と一致しません ' –

+0

今のところ、私はそれを稼働させることができません。 サンプルファイルへのリンクを明確にするために私の質問に追加しました。 –

+0

これは、あなたが言ったようにデータに追加のヘッダー行が含まれていたためです。私は余分な行をスキップするために行を追加しました。更新されたスクリプトを試してください。 –

関連する問題