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

dictまた、 of sを次のようlistに置き換えたい場合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 に答える