2017-04-09 103 views
0

初學程序員在這裏。我有一個csv文件。一列包含日期,另一列包含一個字符串,表示「缺席」或「現在」。 (日期也是一個字符串)我應該在什麼數據結構中組織數據?

我想要完成的是將出現在特定日期的孩子數量的百分比分組。

於是想也許爲例最後的結果我有一個包含日期和同學認爲參加像這樣

Attendance = [[08/22/2016, 89.013],[08/26/2016, 84.33]] 

唯一的問題是我不知道的百分比列表的列表知道如何達到這一點。

難道有人會告訴我如何從A點到B點?

編輯:這個例子讓我們說

file_o = open(csvFile, 'r') 
csvF = csv.reader(file_o) 
for line in csvF: 
    line[0] # contains date 
    line[1] # contains 'Absent' or 'Present 
+2

這是一個非常廣泛的問題。有幾種方法可以做到這一點。把任務分解下來;你能夠將csv數據讀入python列表(步驟1)嗎?你應該在許多小的原子步驟中查看A→B,並逐個解決這些問題。 – roganjosh

+0

添加幾行示例CSV文件和一個讀取它的python程序 - 即使該程序完全損壞。試試csv模塊。 – tdelaney

+0

你可以使用'dict',其中鍵是日期,值是一個不存在/存在的列表。閱讀csv的每一行並更新字典。然後再次運行該詞典並用當前百分比替換它的列表。 – tdelaney

回答

1

一個dict似乎是最簡單的方法。使用它來記錄每個日期的當前/缺失值列表,然後對它們進行求和。由於您只需要某些日期,因此我已使用這些日期初始化跟蹤字典,並忽略其他日期。

(注:更新到工作示例)

import csv 

# write a test file 
open('mytest.csv', 'w').write("""08/22/2016,Present,Fiona 
08/22/2016,Absent,Ralph 
08/23/2016,Present,Fiona 
08/23/2016,Absent,Ralph 
08/24/2016,Present,Fiona 
08/24/2016,Absent,Ralph 
08/25/2016,Present,Fiona 
08/25/2016,Absent,Ralph 



""") 

# initialize tracker with wanted dates. 
wanted_dates = ['08/22/2016', '08/25/2016', '08/30/2016'] 
tracker = {wanted:[] for wanted in wanted_dates} 

with open('mytest.csv', newline='') as fp: 
    reader = csv.reader(fp) 
    for row in reader: 
     if row: 
      date = row[0] 
      # only add wanted dates 
      if date in tracker: 
       present = row[1].lower() 
       tracker[date].append(present == 'present') 

# create final report. make a copy of tracker's values because we 
# will change tracker during enumeration. 
for date, present_list in tracker.items(): 
    if not present_list: 
     # no data, so show 0 
     present_list = [0] 
    tracker[date] = float(sum(present_list))/len(present_list) * 100 

for date, percent in sorted(tracker.items()): 
    print('{} {:2.2f}'.format(date, percent)) 
+0

非常感謝您的回覆,當我在我的程序中嘗試代碼時,我得到一個ValueError:太多值來解壓縮。還假設我已經有了一個特定的日期列表,我需要在該文件中查找日期列表,然後將日期和「Present」和「Absent」列表「附加」到字典中,這也可以解決ValueError,因爲它 – yessir1324

+0

另外我的程序告訴我,end =''是一個無效的關鍵字參數,所以我用'r'取代了它,這可以嗎? – yessir1324

+0

這應該是''newline ='''(我正在慫恿你使用python 3),我有時會在'print'和'open'之間混淆......你會認爲他們會使用相同的名字。你可以測試行的長度,因爲csv也會讀取空行,你可以把想要的日期放在一個集合中,並在添加到字典之前檢查包含的內容。 – tdelaney

相關問題