如何快速确定新日期在已排序日期列表中的插入位置
刚好Python的bisect模块里的bisect_right方法完全匹配你的需求!它天生就是用来解决这种有序列表插入位置查找的场景,而且完美符合你“存在则插右侧,不存在则找对应位置”的要求。
具体实现步骤
- 首先导入需要的模块:
import pandas as pd import bisect
- 定义你的日期列表:
mydates = [pd.Timestamp('2017-03-31 00:00:00'), pd.Timestamp('2017-06-30 00:00:00'), pd.Timestamp('2017-09-30 00:00:00'), pd.Timestamp('2017-12-31 00:00:00'), pd.Timestamp('2018-03-31 00:00:00')]
- 写一个简单的函数来获取插入位置:
def get_insert_pos(target_date, date_list): # bisect_right返回的就是符合要求的插入点 return bisect.bisect_right(date_list, target_date)
测试几个场景验证效果
- 场景1:目标日期比所有元素小(比如你提到的
2016-12-10)
target = pd.Timestamp('2016-12-10') print(get_insert_pos(target, mydates)) # 输出:0,正好插在列表最左侧
- 场景2:目标日期已存在于列表中
target = pd.Timestamp('2017-06-30') print(get_insert_pos(target, mydates)) # 输出:2,原日期在索引1,插在它右侧的位置2
- 场景3:目标日期介于两个元素之间
target = pd.Timestamp('2017-08-15') print(get_insert_pos(target, mydates)) # 输出:2,插在2017-06-30和2017-09-30之间
- 场景4:目标日期比所有元素大
target = pd.Timestamp('2018-06-01') print(get_insert_pos(target, mydates)) # 输出:5,插在列表末尾
为什么bisect_right适合?
bisect_right的核心逻辑就是:在有序列表中找到第一个大于目标元素的位置作为插入点。如果目标元素已经存在,它会跳过所有相同的元素,把插入点放在最后一个相同元素的右侧——这完全贴合你提出的需求,不用自己写复杂的判断逻辑,直接调用就行。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

