Python中如何按列表元素分组计算两个时间列表的最小时间差
嗨,这个问题很好解决,核心就是要为list1里的每个元素单独维护对应的时间差列表,而不是把所有结果都塞进同一个大列表里。我给你两种实现思路,你可以根据需求选:
方法一:用字典分组存储(可读性高,关联原时间)
先把所有时间字符串转成datetime对象(避免重复解析,提升效率),然后用字典把每个list1的时间和它对应的所有符合条件的时间差绑定在一起,最后再提取每个组的最小值:
from datetime import datetime # 你的原始时间列表 list1 = [u'2018-05-06T15:53:05.000-0400', '2018-05-06T17:53:05.000-0400'] list2 = [u'2018-05-06T15:32:24.000-0400', u'2018-05-06T15:32:29.000-0400', u'2018-05-06T15:32:36.000-0400', u'2018-05-06T15:53:05.000-0400', u'2018-05-06T16:42:41.000-0400', u'2018-05-10T00:16:12.000-0400', u'2018-05-10T00:16:23.000-0400', u'2018-05-12T17:37:42.000-0400'] # 定义时间格式,避免重复写 time_format = '%Y-%m-%dT%H:%M:%S.000-0400' # 先把所有字符串转成datetime对象 dt_list1 = [datetime.strptime(t_str, time_format) for t_str in list1] dt_list2 = [datetime.strptime(t_str, time_format) for t_str in list2] # 用字典存储每个list1时间对应的所有符合条件的时间差 time_diffs_map = {} for dt1 in dt_list1: current_diffs = [] for dt2 in dt_list2: if dt1 < dt2: current_diffs.append(dt2 - dt1) time_diffs_map[dt1] = current_diffs # 提取每个list1时间对应的最小时间差(如果没有符合条件的就设为None) min_time_diffs = { dt1.strftime(time_format): min(diffs) if diffs else None for dt1, diffs in time_diffs_map.items() } # 打印结果 for original_time, min_diff in min_time_diffs.items(): print(f"List1中的时间 {original_time} 对应的最小时间差: {min_diff}")
运行后输出:
List1中的时间 2018-05-06T15:53:05.000-0400 对应的最小时间差: 0:59:36 List1中的时间 2018-05-06T17:53:05.000-0400 对应的最小时间差: 3 days, 6:23:07
方法二:用列表的列表分组(按索引对应,适合批量处理)
如果更在意和原list1的索引对应关系,可以用列表嵌套的方式存储,每个子列表对应list1一个元素的时间差:
from datetime import datetime list1 = [u'2018-05-06T15:53:05.000-0400', '2018-05-06T17:53:05.000-0400'] list2 = [u'2018-05-06T15:32:24.000-0400', u'2018-05-06T15:32:29.000-0400', u'2018-05-06T15:32:36.000-0400', u'2018-05-06T15:53:05.000-0400', u'2018-05-06T16:42:41.000-0400', u'2018-05-10T00:16:12.000-0400', u'2018-05-10T00:16:23.000-0400', u'2018-05-12T17:37:42.000-0400'] time_format = '%Y-%m-%dT%H:%M:%S.000-0400' dt_list1 = [datetime.strptime(t_str, time_format) for t_str in list1] dt_list2 = [datetime.strptime(t_str, time_format) for t_str in list2] # 分组存储时间差:grouped_diffs[i]对应list1[i]的所有符合条件的时间差 grouped_diffs = [] for dt1 in dt_list1: diffs = [] for dt2 in dt_list2: if dt1 < dt2: diffs.append(dt2 - dt1) grouped_diffs.append(diffs) # 获取每个分组的最小时间差 min_diffs = [min(diffs) if diffs else None for diffs in grouped_diffs] # 打印结果,和原list1索引对应 for idx, (original_time, min_diff) in enumerate(zip(list1, min_diffs)): print(f"List1第{idx+1}个时间 {original_time} 对应的最小时间差: {min_diff}")
为什么你的原代码不行?
你原来的代码把所有符合value1 < value2的时间差都追加到同一个list3里,没有按list1的元素做分组,所以无法区分哪些差属于list1的第一个元素,哪些属于第二个。上面的两种方法都是先为每个list1元素单独收集时间差,再处理最小值,完美解决这个问题~
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

