2017-10-10 4 views
0

これはどのように可能か考えてみましたが、何も気にしません。ミスマッチしたデータをループする方法

日付とデータを含む2つのcsvファイルがあります。しかし、日付は不一致です。私はすべてのデータをループし、一致する日付を見つけて、共通の日付と別のシートの2つのデータ値を持つテキスト文書を作成するコードを書くことができるようにしたい。もう一つの選択肢は、自分自身をExcelで一致させることです。

提案がありますか?

Ex。

は、私は、このファイル1を持っていると言う:

01/01/01 | 1 
01/02/01 | 2 
01/03/01 | 3 
01/04/01 | 4 
01/05/01 | 5 
01/06/01 | 6 
01/07/01 | 7 
01/08/01 | 8 

このFILE2:私は戻ってきたと思っています何

01/05/01 | 9 
01/06/01 | 22 
01/07/01 | 33 
01/08/01 | 44 
01/09/01 | 55 
01/10/01 | 66 
01/11/01 | 77 
01/12/01 | 88 

は(ループを実行した後)である私が達成しようとしています何の:

01/05/01 | 5 | 9 
01/06/01 | 6 | 22 
01/07/01 | 7 | 33 
01/08/01 | 8 | 44 

ご協力いただきありがとうございます!

答えて

0

はでそれらの項目を見つけ、その後、CSVファイルからデータを格納するリストのdefaultdictを使用しますリストに複数の値を持つディクテーション。

import csv 
from collections import defaultdict 

merged = defaultdict(list) 

for filename in 'f1.csv', 'f2.csv': 
    with open(filename) as f: 
     for date, value in csv.reader(f, delimiter='|'): 
      merged[date].append(value) 

with open('out.csv', 'w') as f: 
    w = csv.writer(f, delimiter='|') 
    for date in sorted(merged): 
     if len(merged[date]) > 1: 
      w.writerow([date] + merged[date]) 

これは(ほとんど)必要なファイル、区切り文字は(周囲のスペースを含む)単一|の代わり|であることを唯一の違いが生成されます。また、入力ファイルも同様に区切られていると仮定しました。

+0

ありがとう、これは完全に機能しました! – Wade

0
  • 両方のファイルで残りのデータがあるとしながら、エキスがD1D2
  • をさかのぼり
  • R1R2、各ファイルの最初のレコードを読む:
    • 場合d1 == d2:
        枚の
      • マージレコードと印刷
      • は、各ファイルの次の行を取得する(新しいR1R2)D1 < d2が
        • が取得する場合、他の
      • R1
    • else
      • は、次のR2

簡単に説明を取得しますが、それぞれの "しおり" を維持、両方のファイルをステップ実行しています。レコードが一致する場合は、それらをマージして印刷します。両方のファイルを進めてください。それ以外の場合は、日付の「後ろ」にあるブックマークを進めます。

0

両方のファイルを読み出すためにCSVモジュールを使用して、date =>list[values]のマップ辞書に変換してから印刷します。

import csv 

# Extract CSV 
csv1 = [] 
with open('first.csv', 'r') as f1: 
    csv_reader = csv.reader(f1) 
    for row in csv_reader: 
     csv1.append(row) 

csv2 = [] 
with open('second.csv', 'r') as f2: 
    csv_reader = csv.reader(f2) 
    for row in csv_reader: 
     csv2.append(row) 

# Initialize dict which will map dates to values 
d = {} 

# Map dates to values by getting a default array and appending the values 
for row in csv1: 
    v = d.get(row[0], []) 
    v.append(row[1]) 
    d[row[0]] = v 

for row in csv2: 
    v = d.get(row[0], []) 
    v.append(row[1]) 
    d[row[0]] = v 

# Print results 
for k, v in d.items(): 
    values = ' | '.join(list(map(str, v))) 
    print(f'{k} | {values}') 
0

pandas joinロジックは、実際に内部結合を日付でキーとして要求しているので、このタスクに適していると思います。

まず、あなたの日付用の解析関数を定義します(これをPythonでのさらなる処理のために実際の日付として扱う必要がある場合に備えて追加しました)。次に、各csvファイルを個別のデータフレームにロードします。最後に、NaNの値をジョインしてドロップして、内部結合を取得します(または、の関数にhowパラメータを設定して明示的に内部結合します)。 to_csv関数を使用して、outptutデータフレームをcsvファイルに簡単にドロップすることもできます。

あなたが集約したり、参加したりすることでもう少し創造的になることを望んでいるなら、パンダが行く方法です。

import pandas 
parser = lambda date: pandas.datetime.strptime(date.strip(), '%y/%m/%d') 
dt = pandas.read_csv('H:\\one.csv', parse_dates = [0], date_parser = parser, index_col=0, delimiter="|", names = ["date", "val"]) 
dt2 = pandas.read_csv('H:\\two.csv', parse_dates = [0], date_parser = parser, index_col=0, delimiter="|", names = ["date", "val2"]) 
dt.join(dt2).dropna().to_csv("H:\\output.csv") 

また、これは動作しますが、あなたのpython内の日付固有の機能のすべてを失う:

import pandas 
dt = pandas.read_csv('H:\\one.csv', index_col=0, delimiter="|", names = ["date", "val"]) 
dt2 = pandas.read_csv('H:\\two.csv', index_col=0, delimiter="|", names = ["date", "val2"]) 
dt.join(dt2, how='inner').to_csv("H:\\output.csv") 
関連する問題