You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从DataFrame中移除按日期分组筛选出的指定日期数据

移除DataFrame中指定日期的所有数据

问题背景

已经通过以下代码筛选出需要排除的日期对应的最后一条时间戳:

df['_datetime'] = df.index
exclude_holidays = df.groupby(df.index.floor('d'))._datetime.last()
exclude_holidays.loc[exclude_holidays.dt.hour < 14]

得到的exclude_holidays包含需要移除的完整日期(索引为年月日,值为当日最后一条时间戳),但尝试的两段代码要么报错ValueError: Lengths must match to compare,要么无法移除目标日期的所有数据。

错误原因分析

  • 第一段代码报错是因为df.index.normalize()生成的是与原DataFrame等长的日期序列,而exclude_holidays是长度远小于原DataFrame的Series,直接用==逐元素对比会因长度不匹配报错。
  • 第二段代码无效是因为exclude_holidays中的值是具体时间戳(如2020-12-24 12:07:12),仅会删除这些单个时间戳对应的行,而非整个日期的所有数据。

正确解决方案

核心是提取需要排除的纯日期部分(仅年月日),再过滤掉原DataFrame中所有属于这些日期的行。

方法一:直接过滤(推荐)

# 提取需要排除的日期集合(仅年月日)
exclude_dates = exclude_holidays.index.date
# 保留不在排除日期内的所有行
df = df[~df.index.date.isin(exclude_dates)]

方法二:使用drop删除

exclude_dates = exclude_holidays.index.date
# 找出所有属于排除日期的索引
to_drop_indices = df[df.index.date.isin(exclude_dates)].index
# 删除这些索引对应的行
df = df.drop(to_drop_indices)

优化筛选排除日期的代码

可以不用新增_datetime列,直接操作索引:

# 分组取每日最后一条记录的索引,筛选小时小于14的日期
exclude_holidays = df.groupby(df.index.floor('d')).apply(lambda x: x.index[-1])
exclude_dates = exclude_holidays[exclude_holidays.hour < 14].date

内容的提问来源于stack exchange,提问作者stanvooz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:41:18