2

現在、1秒間隔で送信されるメッセージをグループ化しようとしています。私は現在、これを使用して時間遅延を計算しています:

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

ただし、送信される1秒あたりの「Tin:[A]」メッセージの数を計算したいので、これを使用してこれを実行しようとしています。

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:時間間隔によるグループ結果

(私はユニットが私が望むもののためにオフになることを理解しています、しかし私はただ一般的な考えを調べています...)

私はこれまでほとんど成功していませんでした。助けていただければ幸いです。

また、データは次のように表示されます。

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

2 に答える 2

3

毎秒 1 秒間隔で発行されたデータでデータをグループ化すると仮定すると、データが順序付けられint(out_ts)、グループ化キーとして使用できるタイムスタンプが秒に切り捨てられるという事実を利用できます。

グループ化を行う最も簡単な方法は、次を使用すること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) で、2 番目の値がその秒に発行されたデータ エントリのリスト (タイムスタンプ = を使用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)

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


解決策を秒の倍数でグループ化するのは比較的簡単であることに注意してください。たとえば、1 分 (60 秒) ごとのメッセージでグループ化するには、get_key関数を次のように変更します。

get_key = lambda x: int(x[0] / 60)  # truncate timestamp to the minute
于 2012-01-12T09:59:50.343 に答える
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 秒幅で、エポックから始まることを知っている間隔からタイムスタンプを再構築できます。

于 2012-01-11T21:23:26.357 に答える