2017-10-10 55 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 

這個文件2:

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
  • 讀取每個文件的第一個記錄,R1R2
  • 提取日期D1D2
  • 雖然沒有留在這兩個文件中的數據:
    • 如果d1 == d2:
      • 合併中的記錄和打印
      • 獲得每個文件的下一行(新R1R2
    • 否則,如果D1 < D2
      • 獲得下一R1
    • 其他
      • 獲得下一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

我認爲大熊貓加入邏輯非常適合這項任務,因爲您有效地要求按日期鍵入內連接。

首先爲您的日期定義一個解析函數(如果您需要將這些日期視爲python中進一步處理的實際日期,則添加該解析函數)。然後將每個csv文件加載到一個單獨的數據框中。最後,加入並刪除NaN值以獲取您要查找的內連接(或通過在join函數中設置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") 

這也將工作,但你失去所有的特定日期的功能蟒之內:

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")