如何基于日期向量排名为Pandas DataFrame新增列并删除同日期行
解决方案
步骤说明
- 确保日期列类型正确:先将
Date列转换为datetime类型(如果尚未转换)。 - 过滤目标日期行:删除日期部分(年月日)与向量
L中任意日期重合的行。 - 计算排名列
new:基于L划分的区间判断每行Date对应的排名,规则为:- 早于
2018-07-15→ 0 - 介于
2018-07-15和2019-07-15之间 → 1 - 晚于
2019-07-15→ 2
- 早于
代码实现
import pandas as pd import numpy as np # 初始化数据(模拟用户输入) L = [pd.Timestamp('2018-07-15 00:00:00'), pd.Timestamp('2019-07-15 00:00:00')] data = { 'c1': [1, 1, 3, 4, 2, 5, 8, 5, 2, 2], 'c2': [2, 7, 7, 7, 2, 1, 4, 4, 9, 6], 'Date': ['2018-07-13 16:00:00', '2018-07-15 16:00:00', '2018-07-15 16:50:00', '2018-07-15 19:50:00', '2018-07-16 16:00:00', '2020-10-10 16:00:00', '2018-06-13 16:00:00', '2021-12-13 16:00:00', '2019-01-01 16:00:00', '2019-01-01 17:00:00'] } df = pd.DataFrame(data) # 步骤1:转换Date列为datetime类型 df['Date'] = pd.to_datetime(df['Date']) # 步骤2:过滤掉日期部分与L中任意日期重合的行 L_dates = {t.date() for t in L} df_filtered = df[~df['Date'].dt.date.isin(L_dates)] # 步骤3:计算new列(使用np.searchsorted高效定位区间) # 若原始L未排序,先执行L_sorted = sorted(L) L_sorted = L df_filtered['new'] = np.searchsorted(L_sorted, df_filtered['Date']) # 查看结果 print(df_filtered)
代码解释
- 日期过滤:通过
dt.date提取Date的年月日部分,结合isin和取反操作~快速过滤掉与L中日期重合的行。 - 排名计算:
np.searchsorted返回每个Date在有序列表L_sorted中的插入位置,正好对应区间排名:- 插入位置0 → 日期早于L的第一个元素
- 插入位置1 → 日期介于L的两个元素之间
- 插入位置2 → 日期晚于L的第二个元素
该方法利用pandas和numpy的内置向量运算,避免循环,效率最优,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

