前回の記事の続きです。
以下のような自動撮影装置の撮影記録 CSVファイルがあって
1 2 3 4 |
ID_A,地点名,ファイル名,日,時,日時,種名,ID_B,雌雄,行動 1,A,A1.avi,2014/01/01,10:00,2014/01/01 10:00,エゾシカ,3,メス,採餌中 2,A,A2.avi,2014/01/01,10:05,2014/01/01 10:05,エゾシカ,3,メス,採餌中 3,A,A3.avi,2014/01/01,11:00,2014/01/01 11:00,エゾタヌキ,3,オス,採餌中 |
X番目に撮影された動画とX+1番目に撮影された動画の撮影時刻を比較し、
差が指定された時間以内(今回は分単位)
かつ
同種同性の個体が撮影されていれば
両者をグループ化する(末尾の列に同じID(gid)を追加する)というスクリプトをpythonで書いてみました。
データ処理後以下のような出力結果が得られます。
1 2 3 4 |
ID_A,地点名,ファイル名,日,時,日時,種名,ID_B,雌雄,行動,gid 1,A,A1.avi,2014/01/01,10:00,2014/01/01 10:00,エゾシカ,3,メス,採餌中,1 2,A,A2.avi,2014/01/01,10:05,2014/01/01 10:05,エゾシカ,3,メス,採餌中,1 3,A,A3.avi,2014/01/01,11:00,2014/01/01 11:00,エゾタヌキ,3,オス,採餌中,3 |
以下の通りメモとして残しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# -*- coding: utf8 -*- ## 標準モジュールのインポート import datetime import csv import dateutil.parser ### 入力例 ## fpath "C:\\temp\\sample.csv" ## intval 10 def gdata(fpath, intval): # csv ファイルの読み取り cobj = csv.reader(open(fpath, "rb")) # csv ファイルを2次元の配列データに変換 arry = [ v for v in cobj] # 撮影間隔をdatetime形式に変換 td = datetime.timedelta(0,0,0,0,intval,0,0) # 配列データの1行目にgid列を追加 ini = arry[0] ini.append("gid") # 繰り返し処理の初期値(0は列名行のため1からはじめる) i = 1 x = 1 # レコードの末端まで繰り返し処理 while i < len(arry): # 配列のi行目にiというgidを挿入 a = arry[i] a.append(str(i)) # 次の行(レコード)がなければここで処理終了 if x + 1 == len(arry): break # 次の行があれば処理を続行 x2 = x + 1 # x行目とx+1行目の6列目のdatetime文字列をdatetime形式にパース dto1 = dateutil.parser.parse(arry[x][5]) dto2 = dateutil.parser.parse(arry[x2][5]) # 同種同性で前のものと10分以内に撮影された個体であればiというグループ化ID(gid)を付与する while dto2 - dto1 < td and arry[x2][6]==arry[x][6] and arry[x2][8]==arry[x][8]: x = x + 1 a = arry[x] a.append(str(i)) # 次の行(レコード)がなければここで処理終了 if x + 1 == len(arry): break # 次の行があれば処理を続行 x2 = x + 1 # x行目とx+1行目の6列目のdatetime文字列をdatetime形式にパース dto1 = dateutil.parser.parse(arry[x][5]) dto2 = dateutil.parser.parse(arry[x2][5]) # 次に作成されるグループのリスト内での順番を定義 i = x + 1 x = x + 1 # 同じフォルダに _g をつけたCSVファイルを新規作成 (同じ名前のファイルがあれば上書きする) f = open(fpath[0:-4] + "_g.csv", 'wb') # 配列データをCSVファイルに変換 csvWriter = csv.writer(f) csvWriter.writerows(arry) # CSVファイル書き込み終了 f.close() print "finish" if __name__ == '__main__': print "this is code block" |