2012-01-11 3 views
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)) 

그러나 나는 "에서 T : [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: group results by time intervals

(나는 단위가 내가 원하는 오프 될 것이다 실현,하지만 난 그냥 일반적인 생각으로 찾고 있어요 ...)

저는 지금까지 대부분 실패했으며 어떤 도움을 주셨습니다. 당신이 양분과 시간 간격에 그리드를 기반으로하지 않는 경우는 쉽게

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

답변

3

초 단위로 1 초 간격으로 발행 된 데이터로 그룹화하려는 경우 데이터가 정렬되어 있으며 int(out_ts)은 그룹으로 사용할 수있는 초로 시간 소인을 자릅니다 키. 튜플의 첫 번째 값이 키 (정수, 예를 들면 082438)과 두 번째 값입니다

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은 튜플의리스트가 될 것입니다 : 그룹화 할

가장 간단한 방법은 itertools.groupby 사용하는 것 는 해당 초에 발행 된 데이터 항목의 목록입니다 (시간 소인 = 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은 두 번째 50 초 간격입니다.

각 간격이 50 초이며 기원에 시작한다는 것을 알고 간격에서 시간 소인을 재구성 할 수 있습니다.

+0

나는이 어려움에 봉착 : 나가서 설명하자면 NameError : 이름이 'defaultdict'정의되어 있지 않습니다. 만약 내가 이것에 익숙하지 않다면 사과드립니다. – eunhealee

+0

Google이 고장 나서 어려움을 겪고 있습니다. 다음은 "python defaultdict"에 대한 Google 검색의 첫 번째 히트 곡입니다. http://docs.python.org/library/collections.html이 라이브러리를 읽고 이해하는 것이 중요합니다. –

관련 문제