[英]Efficiently find which range a value belongs to
我有一些与值相关的日期时间范围。 我想对于其他范围,例如整数,问题也会相同。
ranges = [
(datetime.datetime(2021, 6, 10, 10, 0), datetime.datetime(2021, 6, 10, 10, 30), 100),
(datetime.datetime(2021, 6, 10, 10, 30), datetime.datetime(2021, 6, 10, 11, 0), 200),
(datetime.datetime(2021, 6, 10, 11, 0), datetime.datetime(2021, 6, 10, 11, 30), 150),
...
]
此列表已排序,不包含任何间隙或重叠。 下限是包容性的,上限是排斥性的。
对于给定的日期时间,我想找到它所属范围的值:
def get_value_for_datetime(dt: datetime.datetime) -> int:
???
例如:
>>> get_value_for_datetime(datetime.datetime(2021, 6, 10, 10, 45)
>>> 200
我的第一个想法是查看bisect
模块,但似乎这里没有任何东西可以帮助我处理范围,也没有办法提供自定义 function 来决定向左还是向右看,但也许我错过了一些东西.
我也不反对 numpy 和/或 pandas 解决方案,如果它明显更快,并且如果有帮助,也可以为ranges
列表使用不同的结构。
您可以在下限上使用二分法,然后检查相应的上限是否满足条件upper_bound > value
:
import bisect
lb, ub, values = zip(*ranges)
def get_value_for_datetime(x):
index = bisect.bisect_right(lb, x) - 1
if index == -1 or ub[index] <= x:
raise ValueError(x)
return values[index]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.