2014-03-03 81 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