mer*_*ran 1 python time datetime compare python-2.7
我有这种两种不同的间隔集:
Intervals1:
{'ending_time': '2016-02-26 07:10:40.276504', 'starting_time': '2016-02-26 07:10:39.286168'}
{'ending_time': '2016-02-26 07:10:40.722193', 'starting_time': '2016-02-26 07:10:40.301116'}
{'ending_time': '2016-02-26 07:10:41.329731', 'starting_time': '2016-02-26 07:10:40.812676'}
{'ending_time': '2016-02-26 07:10:42.146669', 'starting_time': '2016-02-26 07:10:41.419473'}
{'ending_time': '2016-02-26 07:10:42.413005', 'starting_time': '2016-02-26 07:10:42.203540'}
{'ending_time': '2016-02-26 07:10:42.686456', 'starting_time': '2016-02-26 07:10:42.442964'}
{'ending_time': '2016-02-26 07:10:43.198191', 'starting_time': '2016-02-26 07:10:42.746994'}
{'ending_time': '2016-02-26 07:10:44.502593', 'starting_time': '2016-02-26 07:10:43.288611'}
{'ending_time': '2016-02-26 07:10:46.525823', 'starting_time': '2016-02-26 07:10:44.709627'}
{'ending_time': '2016-02-26 07:10:47.098280', 'starting_time': '2016-02-26 07:10:46.886541'}
--------------------------
Interval2:
{'ending_time': '2016-02-26 07:10:41.482954', 'starting_time': '2016-02-26 07:10:39.590220'}
{'ending_time': '2016-02-26 07:10:42.615738', 'starting_time': '2016-02-26 07:10:41.649375'}
{'ending_time': '2016-02-26 07:10:46.365902', 'starting_time': '2016-02-26 07:10:45.987907'}
{'ending_time': '2016-02-26 07:10:47.698375', 'starting_time': '2016-02-26 07:10:46.510641'}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下行将这些日期时间字符串转换为真实的日期时间对象:
datetime.datetime.strptime(dictionary['starting_time'], "%Y-%m-%d %H:%M:%S.%f")
Run Code Online (Sandbox Code Playgroud)
我在这里要做的是通过比较这两个不同的集合来匹配重叠的时间间隔。
例如; Intervals1[0] 和 Intervals2[0] 重叠,但 Intervals1[7] 和 Intervals2[0] 不重叠。
那么这样做的正确方法是什么?一个简短的解释对我来说就足够了。
datetime 对象支持比较,因此您只需要检查第一个开始时间是否在另一个的开始和结束之间,或者第一个结束时间是否在其他的开始和结束之间,反之亦然。
def overlap(first_inter,second_inter):
for f,s in ((first_inter,second_inter), (second_inter,first_inter)):
#will check both ways
for time in (f["starting_time"], f["ending_time"]):
if s["starting_time"] < time < s["ending_time"]:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
编辑:还要注意,因为您的日期字符串的格式首先具有最重要的值,所以它可以很容易地进行比较,而无需将它们变成datetime对象。
Edit2:这是将所有组合及其结果记录到字典中的方法:
import itertools
combos = {(i1,i2):overlap(int1,int2)
for (i1,int1),(i2,int2)
in itertools.product(enumerate(Intervals1),enumerate(Intervals2))}
print(*combos.items(),sep="\n")
Run Code Online (Sandbox Code Playgroud)
这种方式combos[0,1]会枯萎Intervals[0]和Intervals[1]重叠等。
然后只需获得一组重叠时间,您可以使用:
overlapped = set(com for com,was_overlapped in combos.items() if was_overlapped)
Run Code Online (Sandbox Code Playgroud)
最后编辑:我很抱歉使用了非常长的dict理解,以令人困惑的格式处理数据非常困难,如果原始时间列表具有模式,那么仅使用 dict 理解的 for 循环部分就会产生所需的结果:
for (i1,int1),(i2,int2) in itertools.product(enumerate(Intervals1),enumerate(Intervals2)):
if overlap(int1,int2):
print(i1,i2)
Run Code Online (Sandbox Code Playgroud)
或者对overlapped集合进行排序,您可以使用sorted内置函数:
overlapped = sorted(overlapped) #this gives a list
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5939 次 |
| 最近记录: |