首页 > 解决方案 > Python pandas 按日期过滤以删除列中不包含日期的所有行

问题描述

我有一个数据不整洁的 excel 文件,我想使用 pandas 函数来清理它。

A 列(时间)包含不同的文本——一些是时间,一些是日期,还有一些是人名。

Time
======== 
Dan
------- 
12:55
------- 
04 Oct 2019

因此,在上面的示例中,我只想按日期过滤 - 所以 2019 年 10 月 4 日将是我的选择。

我考虑过将日期转换为日期格式,然后通过它进行过滤。

df['Time'] = pd.to_datetime(df['Time'],format='%d %b %Y')

但因为并非所有行都包含日期,所以我收到错误

ValueError:时间数据“12:55”与格式“%d %b %Y”不匹配(匹配)

首先,这是过滤它的最佳方法,如果是这样,我如何跳过非日期值进行转换?

标签: pythonpandas

解决方案


谢谢@Serge Ballesta 的评论:

在同一列中混合仅包含日期部分的值和仅包含时间(小时、分钟、...)的值将导致难以处理列...

因此,如果有 2 种不同格式的 DataFrame,这是可能的解决方案,因此可以使用 单独解析它们errors='coerce',如果没有创建匹配缺失值NaN

所以可以通过秒替换缺失SeriesSeries.fillna

date1 = pd.to_datetime(df['Time'],format='%d %b %Y', errors='coerce')
date2 = pd.to_datetime(df['Time'],format='%H:%M', errors='coerce')

df['Time'] = date1.fillna(date2)
print (df)
                 Time
0                 NaT
1 1900-01-01 12:55:00
2 2019-10-04 00:00:00

对于过滤非日期时间过滤行在转换后缺少值boolean indexing

df1 = df[date1.fillna(date2).isna()]
print (df1)
  Time
0  Dan

推荐阅读