按时间间隔对元组排序?python
如何按时间间隔(比如每小时)对这些元组进行排序按时间间隔对元组排序?python,python,sorting,datetime,Python,Sorting,Datetime,如何按时间间隔(比如每小时)对这些元组进行排序 [('172.18.74.146', datetime.time(11, 28, 58)), ('10.227.211.244', datetime.time(11, 54, 19)), ('10.227.215.68', datetime.time(11, 54, 34)), ('10.227.209.139', datetime.time(12, 14, 47)), ('10.227.147.98', datetime.time(14,
[('172.18.74.146', datetime.time(11, 28, 58)), ('10.227.211.244',
datetime.time(11, 54, 19)), ('10.227.215.68', datetime.time(11, 54, 34)),
('10.227.209.139', datetime.time(12, 14, 47)), ('10.227.147.98',
datetime.time(14, 47, 25))]
结果应该是:
[["172.18.74.146, 10.227.211.244, 10.227.215.68", "11-12"], etc...]
我尝试使用group by,但没有得到我想要的:
for dd in data[1:]:
ips = dd[1].split(",")
dates = dd[2].split(",")
i = 0
while(i < len(dates)):
ips[i] = ips[i].strip()
hour, mins, second = dates[i].strip().split(":")
dates[i] = datetime.time(int(hour), int(mins), int(second))
i+=1
order = [(k, ', '.join(str(s[0]) for s in v)) for k, v in groupby(sorted(zip(ips, dates), key=operator.itemgetter(1)), lambda x: x[1].hour)]
数据[1:]中dd的:
ips=dd[1]。拆分(“,”)
日期=dd[2]。拆分(“,”)
i=0
而(日期):
ips[i]=ips[i].strip()
小时,分钟,秒=日期[i].strip().split(“:”)
dates[i]=datetime.time(整数(小时)、整数(分钟)、整数(秒))
i+=1
顺序=[(k,,'.join(str(s[0])表示v中的s))表示k,v表示groupby中的v(排序(zip(ips,dates),key=operator.itemgetter(1)),lambda x:x[1].hour)]
这几乎就是你想要的。使用小时按以下方式分组:
for k,g in itertools.groupby(order, lambda x: x[1].hour):
print k,list(g)
结果:
11 [('172.18.74.146', datetime.time(11, 28, 58)), ('10.227.211.244', datetime.time(11, 54, 19)), ('10.227.215.68', datetime.time(11, 54, 34))]
12 [('10.227.209.139', datetime.time(12, 14, 47))]
14 [('10.227.147.98', datetime.time(14, 47, 25))]
这应该适合您:
from __future__ import print_function
import datetime
import itertools
def iter_len(iterable):
return sum(1 for __ in iterable)
def by_hour(item): # Hour key
timestamp = item[1]
return '{}-{}'.format(timestamp.hour, (timestamp.hour+1) % 24)
def by_half_hour(item): # Half-hour key
timestamp = item[1]
half_hour = timestamp.hour + (0.5 * (timestamp.minute // 30))
return '{:.1f}-{:.1f}'.format(half_hour, (half_hour+0.5) % 24)
def get_results(data, key): # Name this more appropriately
data = sorted(data, key=key)
for key, grouper in itertools.groupby(data, key):
yield (key, iter_len(grouper))
data = [
('172.18.74.146', datetime.time(11, 28, 58)),
('10.227.211.244', datetime.time(11, 54, 19)),
('10.227.215.68', datetime.time(11, 54, 34)),
('10.227.209.139', datetime.time(12, 14, 47)),
('10.227.147.98', datetime.time(14, 47, 25)),
]
print('By Hour')
print(list(get_results(data, by_hour)))
print()
print("By Half Hour")
print(list(get_results(data, by_half_hour)))
输出:
$ ./SO_32081251.py
By Hour
[('11-12', 3), ('12-13', 1), ('14-15', 1)]
By Half Hour
[('11.0-11.5', 1), ('11.5-12.0', 2), ('12.0-12.5', 1), ('14.5-15.0', 1)]
datetime.time(11,54,34))
后缺少的逗号是故意的吗?@Ben,那么对于上面的数据,您需要[('11-12',3),('12-13',1),('14-15',1)]
?@Ben我想这很容易,但您确定这是最好的输出吗?这真的取决于您将如何使用它,但至少我只会包括一小时/半小时的开始。意思是,11
而不是'11-12'
,以及11.5
而不是'11-1130'
。你是如何使用这些值的?@Ben,我想我是想得太多了:P.等等,如果我想把它改为半小时?是拉姆达x:(x[1]。小时/2)吗@兰迪:非常感谢你,谢谢!
$ ./SO_32081251.py
By Hour
[('11-12', 3), ('12-13', 1), ('14-15', 1)]
By Half Hour
[('11.0-11.5', 1), ('11.5-12.0', 2), ('12.0-12.5', 1), ('14.5-15.0', 1)]