2013-04-19 3 views
0

У меня есть файл с ниже формате:Как я могу вычесть фиксированную дату из столбцов даты в файле excel с помощью Python?

name   date 
sam   21/1/2003 
bil   5/4/2006 
sam   4/7/2009 
Mali   24/7/2009 
bil   13/2/2008 
etc... 

Я хочу, чтобы установить дату исправления, например: 1/1/2003 и вычесть все даты с моей даты исправления и разделить их на неделю, чтобы найти из которых имена регистрируются в какие недели и помещают их в набор. Поэтому я хотел бы, чтобы получить конечный результат ниже:

Sam=[week3,week12] 
bil=[week25,week13] etc.. 

У меня есть написать ниже питон скрипт, но это не working.I эта ошибка:

val=set(start_date-'date(data.files.datetime)') 
TypeError: unsupported operand type(s) for -: 'int' and 'str' 

кого-то есть идеи, что является лучший способ написать код для этого?

import pprint 
import csv 


with open('d:/Results/names_info.csv', 'r') as csvfile: 
    start_date= 1/1/2003 
    filereader=csv.reader(csvfile,'excel') 
    for row in filereader: 
     for name in row: 
      key=name 
      val=set(start_date-'date(data.files.datetime)') 
      datedict[key]=val 


pprint.pprint (datedict) 
+0

Как он не работает? –

+0

Я поставил тип ошибки в приведенном выше описании – UserYmY

ответ

1

У вас есть несколько ошибок в коде:

  1. Не обращая внимания на первую строку файла CSV, который содержит «имя» и «дата».
  2. Использование строк для хранения дат вместо date.
  3. Попытка вычесть одну строку из другой.
  4. Изменение элементов в datedict без предварительной проверки их наличия.
  5. Слешите в 1/1/2003 будет рассматриваться как разделяй знаки и результат будет 0.

Вот что ваш код будет выглядеть с фиксированными этими ошибками:

import csv 
from collections import defaultdict 
import datetime 
from datetime import date 
import math 

def weeks(filename, start_date): 
    # The defaultdict class will create items when a key is accessed that does 
    # not exist 
    datedict = defaultdict(set) 
    with open(filename, 'r') as csvfile: 
     filereader = csv.reader(csvfile, 'excel') 
     read_header = False 
     for row in filereader: 
      # Ignore the first row of the file 
      if not read_header: 
       read_header = True 
       continue 

      # Strip out any whitespace 
      cells = [col.strip() for col in row] 
      name = cells[0] 
      date_str = cells[1] 

      # Parse the date string into a date 
      row_date = datetime.datetime.strptime(date_str, '%d/%m/%Y').date() 

      # Calculate the difference between dates 
      delta = start_date-row_date 
      # Convert from days to weeks, you could use math.floor() here if 
      # needed 
      delta_weeks = int(math.ceil(delta.days/7.0)) 

      datedict[name].add(delta_weeks) 

    return datedict 

date_dict = weeks('a.csv', start_date=date(year=2013, month=1, day=1)) 
for name, dates in date_dict.iteritems(): 
    print name, list(dates) 

Это печатает:

bil [351, 254] 
sam [519, 182] 
Mali [179] 

Вы должны быть в состоянии понять, как заставить его печатать «недели».

+0

У вас должны быть дополнительные столбцы в файле, иначе csv не будет правильно прочитан. Попробуйте распечатать содержимое строки. –

+0

Ознакомьтесь с обновленным кодом. –

1

Вы определенно хотите использовать модуль datetime в стандартной библиотеке. Быстрый и грязный метод расчета разницы недели может быть следующим:

import datetime 

start_date = datetime.date(2003,1,1) # (YYYY,MM,DD) 
another_date = datetime.date(2003,10,20) 

difference = start_date - another_date # another datetime object 
weeks_between = difference.days/7 + 1 # integer division, first week = 1 

также, если вы хотите dict из list s заменить datedict[key]=val с

try : 
    datedict[key] += [val] # add the element val to your existing list 
except KeyError :   # catch error if key not in dict yet 
    datedict[key] = [val] # add key to dict with val as one element list 

также, если вы предпочитаете списки имеют строки формы week1, week12 и т. д., а затем просто используйте

val = 'week%d' % val 
Смежные вопросы