2012-01-11 9 views
2

現在、1秒間隔で送信されたメッセージをグループ化しようとしています。私が「でT:[A]」の数を計算したいもつとも時間間隔でメッセージをグループ化する

def time_deltas(infile): 
entries = (line.split() for line in open(INFILE, "r")) 
ts = {} 
for e in entries: 
    if " ".join(e[2:5]) == "T out: [O]": 
     ts[e[8]] = e[0]  
    elif " ".join(e[2:5]) == "T in: [A]":  
     in_ts, ref_id = e[0], e[7] 
     out_ts = ts.pop(ref_id, None) 
     yield (float(out_ts),ref_id[1:-1],(float(in_ts)*1000 - float(out_ts)*1000)) 

INFILE = 'C:/Users/klee/Documents/test.txt' 
import csv 

with open('test.csv', 'w') as f: 
csv.writer(f).writerows(time_deltas(INFILE)) 

:送り出され、毎秒メッセージ、およびこので動作するようにしようとしている私は現在、これで時間の待ち時間を計算していますそうする:ここで見つけることができます

import datetime 
import bisect 
import collections 

data=[ (datetime.datetime(2010, 2, 26, 12, 8, 17), 5594813L), 
    (datetime.datetime(2010, 2, 26, 12, 7, 31), 5594810L), 
    (datetime.datetime(2010, 2, 26, 12, 6, 4) , 5594807L), 
] 
interval=datetime.timedelta(seconds=50) 
start=datetime.datetime(2010, 2, 26, 12, 6, 4) 
grid=[start+n*interval for n in range(10)] 
bins=collections.defaultdict(list) 
for date,num in data: 
idx=bisect.bisect(grid,date) 
    bins[idx].append(num) 
for idx,nums in bins.iteritems(): 
print('{0} --- {1}'.format(grid[idx],len(nums))) 

Python: group results by time intervals

(Iは単位は私が欲しいもののためにオフになり実現が、私はちょうど一般的なアイデアに探しています...)

私は今までほとんど失敗していて、何か助けに感謝します。あなたは二分と時間間隔であなたのグリッドをベースにしていない場合、これは簡単です

082438.577652 - T in: [A] accepted. ordID [F25Q6] timestamp [082438.575880] RefNumber [6018786] State [L] 

答えて

3

2番目に1秒間隔で発行されたデータでデータをグループ化すると仮定すると、データが注文され、int(out_ts)がタイムスタンプを2番目のグループに切り捨ててグループ化することができますキー。グルーピングを行う

最も簡単な方法はitertools.groupbyを使用することであろう。

from itertools import groupby 

data = get_time_deltas(INFILE) 
get_key = lambda x: int(x[0]) # function to get group key from data 
bins = [(k, list(g)) for k, g in groupby(data, get_key)] 

binsタプルの最初の値は、キー(整数、例えば082438)と第二の値であるタプルのリストであろう(タイムスタンプ= 082438.*で)その秒に発行されたデータエントリのリストです。

使用例:

# print out the number of messages for each second 
for sec, data in bins: 
    print('{0} --- {1}'.format(sec, len(data))) 

# write (sec, msg_per_sec) out to CSV file 
import csv 
with open("test.csv", "w") as f: 
    csv.writer(f).writerows((s, len(d)) for s, d in bins) 

# get average message per second 
message_counts = [len(d) for s, d in bins] 
avg_msg_per_second = float(sum(message_count))/len(message_count) 

P.S.この例では、データの順序が維持されるようにをbinsに使用しました。データへのランダムアクセスが必要な場合は、代わりにOrderedDictの使用を検討してください。


解決策を秒単位でグループ化するのは比較的簡単です。例えば、分(60秒)ごとにメッセージをグループに、へget_key機能を変更します。

get_key = lambda x: int(x[0]/60) # truncate timestamp to the minute 
+0

ありがとう!!これは驚くほど効果的です。 :D – eunhealee

+0

あなたは大歓迎です。 –

+0

申し訳ありませんが、どのようにCSVファイルに書き込むことができますか? – eunhealee

1

:としても

は、 データが表示されます。

代わりに、これを実行します。各区間を単一の数に変換します。

def map_time_to_interval_number(epoch, times) 
    for t in times: 
     delta= (t - epoch) 
     delta_t= delta.days*60*60*24 + delta.seconds + delta.microseconds/1000000.0 
     interval = delta_t/50 
     yield interval, t 

counts = defaultdict(int) 
epoch = min(data) 
for interval, time in map_time_to_interval_number(epoch, data): 
    counts[interval] += 1 

間隔は整数です。 0は最初の50秒間隔です。 1は、2番目の50秒間隔です。

各間隔が50秒幅で、エポックで始まることを知って、間隔からタイムスタンプを再構築できます。

+0

私はこれで困難を抱えている: NameError:名「defaultdict」が定義されていません。 私はこのことに慣れていないとお詫び申し上げます。 – eunhealee

+0

Googleが壊れているために問題が発生しています。ここでは、 "python defaultdict"のGoogle検索での最初のヒットがあります。 http://docs.python.org/library/collections.htmlこのライブラリを読んで理解することが重要です。 –

関連する問題