interval3
interval3是区间模块(interval)的分支,主要用于处理区间间隔类型的数据,比如日期、IP地址、频段等。支持python2.7以及python3.x,在linux和windows上都兼容。
interval3模块提供了Interval和IntervalSet两种数据类型。Interval类描述了一个连续的范围区间,这个区间可以是闭、开、半闭半开、无穷的,他的区间值不一定是数字,可以包含任何支持python比较操作(<, <=, ==, >=, >等)的数据类型,比如字符串,时间等等,因此,Interval对象也支持python的<, <=, ==, >=, >等操作;而IntervalSet包含了一个或多个Interval集合。
安装
pip install interval3
常用方法
Interval
Interval(lower_bound=-Inf, upper_bound=Inf, closed=True, upper_closed=True, lower_closed=True) # 返回一个开/闭区间的Interval对象,默认上限无穷大,下限无穷小
between(a, b, closed=True) # 返回一个开/闭区间的Interval对象,(a, b)或者[a, b]
equal_to(a) # 返回Interval对象,区间值[a, a]
less_than(a) # 返回Interval对象,区间值(-inf, a)
less_than_or_equal_to(a) # 返回Interval对象,区间值(-inf, a]
greater_than(a) # 返回Interval对象,区间值(a, inf)
greater_than_or_equal_to(a) # 返回Interval对象,区间值[a, inf)
join(other) # 将两个连续的Interval对象拼接,返回新的Interval对象,如果不是连续的区间对象则会抛出异常
overlaps(other) # 两个区间是否有重叠
adjacent_to(other) # 两个区间是否不重叠的毗邻,例:Interval(3, 6, closed=False).adjacent_to(Interval(6,8))
IntervalSet
IntervalSet存储区间集合,自动将有交集的区间合并
add 追加一个区间或者单个值,传入一个Interval对象或者一个值,无返回值
remove 移除某个区间或者单个值,传入一个Interval对象或者一个值,无返回值,如果值或者区间不在集合中则抛出异常
discard 同remove,但是值或者区间不在集合中不会抛出异常
difference_update 与传入的区间集合取差集
update 更新区间集合,传入一个区间集合,将原区间集合更新
因此:
IntervalSet对象同样支持集合运算
使用
主要是将时间段或者ip地址段或者区间段专为Interval对象后,通过IntervalSet做集合操作,注意:操作时间或者ip地址时,需要自行做临界值的处理。
officeHours = IntervalSet.between("08:00", "17:00")
myLunch = IntervalSet.between("11:30", "12:30")
officeHours & myHours
>>> ['08:30'..'11:30'),('12:30'..'17:00']
r1 = IntervalSet([Interval(1, 1000), Interval(1100, 1200)])
r2 = IntervalSet([Interval(30, 50), Interval(60, 200), Interval(1150, 1300)])
r1 - r2
>>> IntervalSet([Interval(1, 30, lower_closed=True, upper_closed=False), Interval(50, 60, lower_closed=False, upper_closed=False), Interval(200, 1000, lower_closed=False, upper_closed=True), Interval(1100, 1150, lower_closed=True, upper_closed=False)])
r1 & r2
>>> IntervalSet([Interval(30, 50, lower_closed=True, upper_closed=True), Interval(60, 200, lower_closed=True, upper_closed=True), Interval(1150, 1200, lower_closed=True, upper_closed=True)])
r1 | r2
>>> IntervalSet([Interval(1, 1000, lower_closed=True, upper_closed=True), Interval(1100, 1300, lower_closed=True, upper_closed=True)])
interval3库的源码很简单,也不涉及复杂逻辑,只是避免重复造轮子,在必要的时候提高开发效率。