2012-04-12 25 views
1

日付のグループを識別し、グループのサイズを測定する関数を作成しようとしています。日付比較/連続日付グループ

この関数は、日付順にソートされた要素のリスト(要素は日付が入ったCSVファイルの個々の行です)を取得します。リストは、0からn要素の長さであってもよい。私は、日付グループのサイズを加えて、入力されたリストを書きたいと思う。

例えば、リスト

Bill 01/01/2011 

Bill 02/01/2011 

Bill 03/01/2011 

Bill 05/01/2011 

Bill 07/01/2011 

Bill 01/01/2011 3 

Bill 02/01/2011 3 

Bill 03/01/2011 3 

Bill 05/01/2011 1 

Bill 07/01/2011 1. 

としてIは、2つの間のデルタを返し既にisBeside(string1, string2)と呼ばれる機能を有している(理想的には、ファイルへの印刷)出力であるべきです。

私の試みはこれまでのところ、これは

coll[i][1]はCSVラインの日付要素が含まれています(反復の混乱は、イム必ずPythonはこれよりもエレガントすることができます)です。

def printSet(coll): 
    setSize = len(coll) 
    if setSize == 0: 
    #dont need to do anything 
elif setSize == 1: 

    for i in coll: 
     print i, 1 

elif setSize > 1: 

    printBuffer = [] ##new buffer list which will hold sequential dates, 
         until a non-sequential one is found 
    printBuffer.append(coll[0]) #add the first item 
    print 'Adding ' + str(coll[0]) 

    for i in range(0, len(coll)-1): 

     print 'Comparing ', coll[i][1], coll[i+1][1], isBeside(coll[i][1], coll[i+1][1]) 

     if isBeside(coll[i][1], coll[i+1][1]) == 1: 
      printBuffer.append(coll[i+1]) 
      print 'Adding ' + str(coll[i+1]) 
     else: 
      for j in printBuffer: 
       print j, len(printBuffer) 
      printBuffer = [] 
      printBuffer.append(coll[i]) 

return 
+0

これはデータベースが非常に優れているものです。代わりにデータベースの使用を検討しましたか? – gfortune

+0

うん。私の問題は、CSVファイルに多くの人や他の変数があることです。手続き的に私のための道に見えました。最終的に週末/就業日をチェックする必要があるので、そうでなければ証明されるはずですが、DBは保留になるとは思いません。私はこの方法で私が近づいてきたように感じ、それを捨てたくない:) – Pythonn00b

+0

日付は月/日/年の形式か、日/月/年ですか? –

答えて

1

これはなんですか?

from datetime import date, timedelta 

coll = [['Bill', date(2011,1,1)], 
     ['Bill', date(2011,1,2)], 
     ['Bill', date(2011,1,3)], 
     ['Bill', date(2011,1,5)], 
     ['Bill', date(2011,1,7)]] 

res = [] 
group = [coll[0]] 
i = 1 

while i < len(coll): 
    row = coll[i] 
    last_in_group = group[-1] 

    # use your isBeside() function here... 
    if row[1] - last_in_group[1] == timedelta(days=1): 
     # consecutive, append to current group.. 
     group.append(row) 
    else: 
     # not consecutive, start new group. 
     res.append(group) 
     group = [row] 
    i += 1 

res.append(group) 

for group in res: 
    for row in group: 
     for item in row: 
      print item, 
     print len(group) 

それは印刷されます。

Bill 2011-01-01 3 
Bill 2011-01-02 3 
Bill 2011-01-03 3 
Bill 2011-01-05 1 
Bill 2011-01-07 1 
+0

これは完璧です。読んでいただきありがとうございます。 – Pythonn00b

0

datetimeモジュールには、現在使用している文字列比較を行うよりもはるかにきれいになり、日付、で作業するための非常に良いです。ここで

は一例です:

from datetime import datetime 

def add_month(dt): 
    # Normally you would use timedelta, but timedelta doesn't work with months 
    return dt.replace(year=dt.year + (dt.month==12), month=(dt.month%12) + 1) 

data = ['Bill 01/01/2011', 'Bill 02/01/2011', 'Bill 03/01/2011', 'Bill 05/01/2011', 'Bill 07/01/2011'] 
dates = [datetime.strptime(line.split(' ')[1], '%m/%d/%Y') for line in data] 
buffer = [data[0]] 
for i, date in enumerate(dates[1:]): 
    if add_month(dates[i]) == date: 
     buffer.append(data[i+1]) 
    else: 
     print '\n'.join(line + ' ' + str(len(buffer)) for line in buffer) 
     buffer = [data[i+1]] 

print '\n'.join(line + ' ' + str(len(buffer)) for line in buffer) 

私はあなたの日付をフォームmonth/day/yearにあったことを前提と一緒に行った、彼らは実際にday/month/yearあるならば、あなたはdatetime.strptime()に形式を変更、トップにfrom datetime import timedeltaを追加することができます'%d/%m/%y'add_month(dates[i]) == dateの代わりにdate - dates[i] == timedelta(days=1)を使用してください。