我目前正在尝试按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 in:[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]
答案 0 :(得分: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
),第二个值是在该元素上发布的数据条目列表秒(时间戳= 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。在此示例中,list
用于bins
,以便维护数据的顺序。如果您需要随机访问数据,请考虑使用OrderedDict
代替。
请注意,将解决方案调整为按秒的倍数是相对简单的。例如,要按每分钟的消息分组(60秒),请将get_key
功能更改为:
get_key = lambda x: int(x[0] / 60) # truncate timestamp to the minute
答案 1 :(得分: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秒并从纪元开始。