按时间间隔对元组排序?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)]