我有一个日志文件,它只是一列中的日期和另一列中的时间。我正在努力寻找最受欢迎的时间段。
Date Time
Jan/01/2017 08:23:45
Jan/01/2017 15:54:21
Jan/02/2017 04:02:39
Jan/03/2017 06:33:12
...
我正在寻找一种有效的方法将数据分组为10分钟,然后找到最受欢迎的1小时间隔。因此,最受欢迎的小时长间隔很可能是连续的:
Interval Count
08:10:00 - 09:10:00 586
08:20:00 - 09:20:00 565
08:30:00 - 09:30:00 544
...
这必须很好地扩展到GB的数据,我需要能够找到最流行的间隔,最好不要对整个表进行排序。
答案 0 :(得分:1)
您可以从午夜转换为分钟,使用整数除法和Counter
。无需对数据进行排序,这应该可以正常工作并且效率很高:
from collections import Counter
log = """Jan/01/2017 08:23:45
Jan/01/2017 15:54:21
Jan/01/2017 15:50:21
Jan/01/2017 15:52:21
Jan/02/2017 04:02:39
Jan/03/2017 06:33:12"""
portion = 10
interval = 60
counter = Counter()
for line in log.split("\n"):
time = line.split()[-1]
hour, minute, second = map(int, time.split(':'))
since_midnight = hour * 60 + minute
counter[since_midnight // portion] += 1
for slot, count in counter.most_common():
print("%02d:%02d -> %02d:%02d - %d" % ((slot * portion) / 60,
(slot * portion) % 60,
((slot + 1) * portion) / 60,
((slot + 1) * portion) % 60,
count))
输出:
15:50 -> 16:00 - 3
04:00 -> 04:10 - 1
08:20 -> 08:30 - 1
06:30 -> 06:40 - 1
由于你没有写任何代码,我会给你一个练习:对于给定的10分钟部分,增加包含该部分的每60分钟间隔的计数器。一个简单的for循环应该做。
此外,您应该逐行阅读文件。 split("\n")
只是一个简单的例子。