2014-03-03 25 views
2

我需要一些幫助,使一些CSV文件列表:Python,製作3個日期列表

現在,我導入了一個文件,並製作了兩個列表。我的代碼在這裏:

列表week,包含所有星期,日期取自row[0]

列表weight = []包含所有權重,從row[1]

我的代碼,你到目前爲止在這裏看到:

import csv 
import datetime 
import matplotlib.pyplot as plt 
from pprint import pprint 

#Open Data/File 
data1 = open('wloss.csv', 'r') 
reader1 = csv.reader(data1, delimiter=',') 

week = [] 
weight = [] 
dateTime = [] 

week_year_2011 = [] 
week_year_2012 = [] 
week_year_2013 = [] 
weight_year_2011 = [] 
weight_year_2012 = [] 
weight_year_2013 = [] 

for row in reader1: 

    if row[0] != 'week': 
     week.append(row[0][:-13]) 
    if row[1] != 'weight loss': 
     weight.append(row[1]) 

for item in week: 
    dateTime.append(datetime.datetime.strptime(item, '%Y-%m-%d')) 

本週名單,我得到的日期從2004年過2014

像這樣(只從2005年看到的數據):

datetime.datetime(2005, 4, 10, 0, 0), 
datetime.datetime(2005, 4, 17, 0, 0), 
datetime.datetime(2005, 4, 24, 0, 0), 
datetime.datetime(2005, 5, 1, 0, 0), 
datetime.datetime(2005, 5, 8, 0, 0), 
datetime.datetime(2005, 5, 15, 0, 0), 
datetime.datetime(2005, 5, 22, 0, 0), 

我知道2011年的第一次約會和結束日期是:

datetime.datetime(2011, 1, 2, 0, 0), 
datetime.datetime(2011, 12, 25, 0, 0), 

如何把在datetime數據僅從2011年,2012年和2013年在3名新的名單就像我在這裏下已經定義:

week_year_2011 = [] 
week_year_2012 = [] 
week_year_2013 = [] 

應該做出for陳述或什麼?

還有如何從2011年,2012年,2013得到正確的重量,把他們在其他3只列出這樣的:

weight_year_2011 = [] 
weight_year_2012 = [] 
weight_year_2013 = [] 

我必須做出3個區(1個圖)與數據2011年,2012年和2013年。 希望有人可以幫助如何製作這些新列表並在其中輸入正確的數據。

回答

2

我會用字典按日期分組數據。

您似乎在第一行有一個帶有標題的CSV文件。這裏是一個按日期打出的數據爲單獨列出簡單的版本:

import csv 
import datetime 

by_year = {} 

with open('wloss.csv', 'rb') as data1: 
    reader = csv.reader(data1) 
    next(reader, None) # skip first row with headers 

    for week, weight_loss in reader: 
     date = datetime.datetime.strptime(week, '%Y-%m-%d').date() 
     by_year.setdefault(date.year, []).append((week, weight_loss)) 

這將構建一個字典鍵上一年,每個值的元組(date, weight_loss)名單。

+0

我也會提示字典。當然,你可以使用'defaultdict(list)'來避免需要setdefault。 –

+0

@JohnZwinck:是的,但我想保持簡單一點,因爲我已經徹底改寫了整個代碼。最好不要在其中引入太多新的概念。 –

+0

那麼,如果我嘗試你寫的代碼...我得到關閉文件錯誤的I/O操作。 – Raaydk