如何从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
相关产品推荐
相关产品推荐

