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

如何在Pandas DataFrame中排除指定日期的数据?

解决Pandas筛选数据时出现的KeyError: True问题

嘿,咱们先来拆解下你遇到的KeyError: True到底是怎么回事:

问题根源

你写的这行筛选代码有语法逻辑错误:

df2 = df["date" != datetime.datetime.strptime('2018-04-08', '%Y-%m-%d').date()]

这里的"date" != 目标日期会先被计算成一个布尔值True(因为字符串"date"和datetime.date对象肯定不相等),这时候你相当于在告诉Pandas“给我取名为True的列”,但你的DataFrame里根本没有这个列,自然就抛出了KeyError: True。

正确的姿势应该是:先取出DataFrame中的date列,再和目标日期做比较,得到一个布尔索引,用这个索引去筛选你需要的行。

修正后的代码方案

方案1:修正Pandas筛选逻辑

调整代码的筛选部分,把列引用和比较逻辑分开:

import pandas as pd
import psycopg2
import pandas.io.sql as psql
import datetime

conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432")
cur = conn.cursor()

df = psql.read_sql("Select * from device_mse", conn)
# 先定义目标日期,再用列做比较
target_date = datetime.datetime.strptime('2018-04-08', '%Y-%m-%d').date()
df2 = df[df["date"] != target_date]
print(df2)

方案2:更高效的方式——直接在SQL中过滤(强烈推荐)

其实完全没必要把所有数据都拉到Pandas里再筛选,直接在SQL查询阶段就排除掉2018-04-08的记录,这样能减少数据传输量,运行效率更高:

import pandas as pd
import psycopg2
import pandas.io.sql as psql

conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432")
cur = conn.cursor()

# 直接在SQL语句中添加过滤条件
df = psql.read_sql("SELECT * FROM device_mse WHERE date != '2018-04-08'", conn)
print(df)

额外提示:如果要永久删除数据库中的记录

如果你的需求是把数据库里2018-04-08的记录彻底删掉,而不是仅仅在DataFrame中过滤,那应该直接执行SQL的DELETE语句,而不是用Pandas处理:

import psycopg2

conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432")
cur = conn.cursor()

# 执行删除操作,一定要记得提交事务!
cur.execute("DELETE FROM device_mse WHERE date = '2018-04-08'")
conn.commit()

# 关闭连接
cur.close()
conn.close()

⚠️ 注意:执行删除操作前,建议先运行SELECT * FROM device_mse WHERE date = '2018-04-08'确认要删除的记录数量,最好备份一下数据再操作哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:38:29