0

我有一个格式如下的文件:

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

我想设置一个固定日期,例如:2003 年 1 月 1 日,然后从我的固定日期中减去所有日期,然后将它们除以周,找出哪些名称在哪些周注册,并将它们放在一组中。所以我想得到以下最终结果:

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

我已经编写了下面的 python 脚本,但它不工作。我有这个错误:

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

2 回答 2

1

您的代码中有几个错误:

  1. 不要忽略包含“名称”和“日期”的 csv 文件的第一行。
  2. 使用字符串而不是date类型来存储日期。
  3. 试图从另一个字符串中减去一个字符串。
  4. datedict在没有首先检查它们是否存在的情况下修改项目。
  5. 2003 年 1 月 1 日的斜线将被视为分号,结果将为 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]

您应该能够弄清楚如何让它打印“周”。

于 2013-04-19T10:06:20.123 回答
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

如果你想要一个dictof lists 替换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
于 2013-04-19T10:06:53.033 回答