Pandas删除所有不是“datetime”类型的行

27

我有一个包含用户登录信息的大文件。问题是该文件包含了其他信息在Date列中。我想要删除所有不属于datetime类型的行。我的数据类似于

df

名称 日期
name_1 2012-07-12 22:20:00
name_1 2012-07-16 22:19:00
name_1 2013-12-16 17:50:00
name_1 4345 # 类型='int'
... # 类型='float'
name_2 2010-01-11 19:54:00
name_2 2010-02-06 12:10:00
...
name_2 2012-07-18 22:12:00
name_2 4521
...
name_5423 2013-11-23 10:21:00
...
name_5423 7532

我已经尝试修改解决方案为:

如何使用 Pandas 在数据框中查找非数字行?

如何使用 Pandas 删除值类型为字符串的行?

以及 如何在 Python Pandas 中删除数据框中的行

以适应我的需求。

问题是,每当我尝试进行更改时,要么会出现错误,要么整个数据框就被删除了。


1
df = df[df['Date'].apply(lambda x: type(x) == datetime.datetime)] 这个应该可以工作吧? - EdChum
2个回答

52

使用参数errors='coerce'pd.to_datetime函数将非日期转换为NaT空值,然后您可以删除这些行。

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df = df.dropna(subset=['Date'])

df

在此输入图片描述


这很有帮助。顺便说一下,现在更现代的pandas上是“errors ='ignore'”(我使用的是0.24版本)。否则,点赞! - pmueller
在 pandas 1.1.1 版本中,仍然使用 "coerce" 来获取 NaN 值(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)。 - Vega

1

我们可以使用与 @piRSquared 相同的方法将非日期时间值转换为 NaT 值,并使用 notna(即选择非 NaN 值)创建布尔序列并过滤 df

df = df[pd.to_datetime(df['Date'], errors='coerce').notna()]

请注意,与@piRSquared的方法不同,这种方法不会修改“Date”列的数据类型。它是否是可取的行为由您决定。
输出:
         Name                 Date
0      name_1  2012-07-12 22:20:00
1      name_1  2012-07-16 22:19:00
2      name_1  2013-12-16 17:50:00
5      name_2  2010-01-11 19:54:00
6      name_2  2010-02-06 12:10:00
8      name_2  2012-07-18 22:12:00
11  name_5423  2013-11-23 10:21:00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接