jjo*_*jon 13 python datetime intersection
作为一个普遍感兴趣的问题,我想知道是否有更优雅/有效的方法来做到这一点.我有一个函数比较两个日期的开始/结束元组,如果它们相交,则返回true.
from datetime import date
def date_intersection(t1, t2):
t1start, t1end = t1[0], t1[1]
t2start, t2end = t2[0], t2[1]
if t1end < t2start: return False
if t1end == t2start: return True
if t1start == t2start: return True
if t1start < t2start and t2start < t1end: return True
if t1start > t2start and t1end < t2end: return True
if t1start < t2start and t1end > t2end: return True
if t1start < t2end and t1end > t2end: return True
if t1start > t2start and t1start < t2end: return True
if t1start == t2end: return True
if t1end == t2end: return True
if t1start > t2end: return False
Run Code Online (Sandbox Code Playgroud)
因此,如果:
d1 = date(2000, 1, 10)
d2 = date(2000, 1, 11)
d3 = date(2000, 1, 12)
d4 = date(2000, 1, 13)
Run Code Online (Sandbox Code Playgroud)
然后:
>>> date_intersection((d1,d2),(d3,d4))
False
>>> date_intersection((d1,d2),(d2,d3))
True
>>> date_intersection((d1,d3),(d2,d4))
True
Run Code Online (Sandbox Code Playgroud)
等等
我很想知道是否有一个更pythonic /更优雅/更高效/更简洁/更好的方式来做这个可能mxDateTime或一些聪明的黑客与timedelta或set()?
另一种有用的形式是函数返回交集的开始/结束元组(如果找到一个)
谢谢
And*_*rew 20
它不是Pythonic,但你可以简单地用逻辑来决定一个交叉点.这个特殊的问题出现了很多:
return (t1start <= t2start <= t1end) or (t2start <= t1start <= t2end)
Run Code Online (Sandbox Code Playgroud)
要弄清楚为什么这个工作可以考虑两个间隔可以交叉的不同可能方式,并看到一个的起点必须始终在另一个的范围内.
另一种希望更容易理解的解决方案:
def has_overlap(A_start, A_end, B_start, B_end):
latest_start = max(A_start, B_start)
earliest_end = min(A_end, B_end)
return latest_start <= earliest_end:
Run Code Online (Sandbox Code Playgroud)
我们可以很容易地获得重叠的间隔(latest_start, earliest_end).请注意,latest_start可以等于earliest_end.
应该指出,这假设A_start <= A_end和B_start <= B_end.
这是一个为您提供交叉范围的版本.恕我直言,它可能不是最优化的条件,但它清楚地显示t2何时与t1重叠.如果您只想要true/false,可以根据其他答案进行修改.
if (t1start <= t2start <= t2end <= t1end):
return t2start,t2end
elif (t1start <= t2start <= t1end):
return t2start,t1end
elif (t1start <= t2end <= t1end):
return t1start,t2end
elif (t2start <= t1start <= t1end <= t2end):
return t1start,t1end
else:
return None
Run Code Online (Sandbox Code Playgroud)