如何在Pandas中基于指定日期列表计算日期差值列
解决方案
可以借助numpy.searchsorted高效定位每个日期对应的参考日期,结合Pandas的日期处理能力实现需求,具体步骤如下:
1. 准备数据与环境
首先导入所需库,并确保DataFrame的b列是datetime类型:
import pandas as pd import numpy as np import datetime # 创建示例DataFrame data = { 'a': [7,6,1,3,8,9,4], 'b': ['2019-05-01 00:00:01', '2019-05-02 00:15:01', '2019-05-06 00:10:01', '2019-05-09 01:00:01', '2019-05-09 04:20:01', '2019-05-12 01:10:01', '2019-05-16 03:30:01'] } df = pd.DataFrame(data) df['b'] = pd.to_datetime(df['b']) # 日期列表 l = [datetime.datetime(2019,5,2), datetime.datetime(2019,5,10), datetime.datetime(2019,5,22)] # 确保列表已排序(提升通用性,即使原列表无序也能正常工作) l_sorted = sorted(l)
2. 定位参考日期
使用np.searchsorted找到每个b列日期在排序后列表中的插入位置,再根据位置确定对应的参考日期:
# 获取每个日期在排序列表中的插入位置 insert_pos = np.searchsorted(l_sorted, df['b'], side='right') # 确定每行的参考日期:插入位置>0则取列表中前一个元素,否则取列表最小日期 df['date'] = [l_sorted[pos-1] if pos > 0 else l_sorted[0] for pos in insert_pos]
3. 计算天数差值delta
利用Pandas的日期差计算功能,直接得到天数差值:
df['delta'] = (df['b'] - df['date']).dt.days
最终结果
运行上述代码后,DataFrame将生成符合预期的输出:
a b date delta 0 7 2019-05-01 00:00:01 2019-05-02 -1 1 6 2019-05-02 00:15:01 2019-05-02 0 2 1 2019-05-06 00:10:01 2019-05-02 4 3 3 2019-05-09 01:00:01 2019-05-02 7 4 8 2019-05-09 04:20:01 2019-05-02 7 5 9 2019-05-12 01:10:01 2019-05-10 2 6 4 2019-05-16 03:30:01 2019-05-10 6
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

