Python 3.x 选择发生日期时间错误的行
我需要在数据框()内对日期进行验证,检查日期是否有效。如果Python 3.x 选择发生日期时间错误的行,python-3.x,pandas,datetime,Python 3.x,Pandas,Datetime,我需要在数据框()内对日期进行验证,检查日期是否有效。如果日期无效(例如pd.to_datetime无法解析-0107-01-06),我需要用是填充失败列 我对包含日期的列进行了子集划分,能够识别包含无效日期的列并将它们添加到dict中,但还没有弄清楚如何返回特定的行 我对其他方法持开放态度,但我需要使用pandas并以一个Fail列结束,以指示我计划对其过滤最终数据帧的行(一个数据帧包含日期不正确的行,另一个不包含错误) 有关完整代码,请参见pastebin链接 # insert empty
日期
无效(例如pd.to_datetime
无法解析-0107-01-06),我需要用是
填充失败
列
我对包含日期的列进行了子集划分,能够识别包含无效日期的列并将它们添加到dict中,但还没有弄清楚如何返回特定的行
我对其他方法持开放态度,但我需要使用pandas
并以一个Fail列结束,以指示我计划对其过滤最终数据帧的行(一个数据帧包含日期不正确的行,另一个不包含错误)
有关完整代码,请参见pastebin链接
# insert empty Fail column to identify date errors
df.insert(loc=0, column='Fail', value="")
# replace all blanks with np.NaN
df.replace(r"^s*$", np.nan, regex=True, inplace = True)
# get list of date columns
cols = list(df)
date_cols = cols[2:]
# create empty dict
dfs = {}
# iterate over date columns to identify which columns contain invalid dates & add to dfs
for col in df[date_cols]:
try:
df[col] = df[col].apply(pd.to_datetime, errors='raise')
except:
print("%s column contains invalid date" % col)
dfs[col] = df[col]
您所描述的问题可以通过
强制
和一些逻辑来解决:
# original non_null
notnull = df[col].notnull()
# where to_datetime fails
not_datetime = pd.to_datetime(df[col], errors='coerce').isna()
not_datetime = not_datetime & notnull
IIUC,您关心的是创建
Fail
列。所以,我专注于创造它。
我认为您可以通过在axis=1上使用自定义lambda进行切片,在datetime列上应用来实现这一点。lambda将过滤掉NaN
,然后使用强制将每个片段传递给pd.to_datetime
,并从输出中检查任何NaT
df['Fail'] = (df[date_cols].apply(lambda x: pd.to_datetime(x[x.notna()], errors='coerce')
.isna().any(), axis=1).replace({True: 'Fail', False: ''}))
Out[869]:
Fail patient_ID DateOfBirth ... date_10 date_11 date_12
0 A001 1950-03-02 ... NaT NaT NaN
1 A001 1950-03-02 ... NaT NaT NaN
2 A001 1950-03-02 ... NaT NaT NaN
3 A001 1950-03-02 ... NaT NaT NaN
4 A001 1950-03-02 ... 2010-01-01 NaT NaN
5 A001 1950-03-02 ... NaT 2010-01-01 NaN
6 A001 1950-03-02 ... NaT NaT 1/1/2010
7 A001 1950-03-02 ... NaT NaT 1/1/2010
8 A001 1950-03-02 ... NaT NaT 1/1/2010
9 A001 1950-03-02 ... NaT NaT 1/1/2010
10 A001 1950-03-02 ... NaT NaT 1/1/2010
11 A001 1950-03-02 ... NaT NaT 1/1/2010
12 A001 1950-03-02 ... NaT NaT 1/1/2010
13 A001 1950-03-02 ... NaT NaT 1/1/2010
14 A001 1950-03-02 ... NaT NaT 1/1/2010
15 Fail A002 1950-03-02 ... NaT NaT NaN
16 A002 1950-03-02 ... NaT NaT NaN
17 A002 1950-03-02 ... NaT NaT NaN
18 A002 1950-03-02 ... NaT NaT NaN
19 A002 1950-03-02 ... 2010-01-01 NaT NaN
20 A002 1950-03-02 ... NaT 2010-01-01 NaN
21 A002 1950-03-02 ... NaT NaT 1/1/2010
22 A002 1950-03-02 ... NaT NaT 1/1/2010
23 A002 1950-03-02 ... NaT NaT 1/1/2010
24 A002 1950-03-02 ... NaT NaT 1/1/2010
25 A002 1950-03-02 ... NaT NaT 1/1/2010
26 A002 1950-03-02 ... NaT NaT 1/1/2010
27 A002 1950-03-02 ... NaT NaT 1/1/2010
28 A002 1950-03-02 ... NaT NaT 1/1/2010
29 Fail A002 1950-03-02 ... NaT NaT 0107-01-06
[30 rows x 15 columns]
注意:
上面的代码用于创建Fail
列。它不会将这些列转换为datetime。要转换它们,只需分别调用pd.To_datetime
下面是两行的值,其中Fail
In [870]: df.loc[15]
Out[870]:
Fail Fail
patient_ID A002
DateOfBirth 1950-03-02 00:00:00
date_1 0107-01-06
date_2 2010-01-01 00:00:00
date_3 NaT
date_4 NaT
date_5 NaT
date_6 NaT
date_7 NaT
date_8 NaT
date_9 NaT
date_10 NaT
date_11 NaT
date_12 NaN
Name: 15, dtype: object
In [871]: df.loc[29]
Out[871]:
Fail Fail
patient_ID A002
DateOfBirth 1950-03-02 00:00:00
date_1 NaN
date_2 NaT
date_3 NaT
date_4 NaT
date_5 NaT
date_6 NaT
date_7 NaT
date_8 NaT
date_9 NaT
date_10 NaT
date_11 NaT
date_12 0107-01-06
Name: 29, dtype: object
无需尝试:df[col]=pd.to_datetime(df[col],errors='concure')
提供pd.NaT
其中to_datetime
失败。@QuangHoang,我需要知道哪些值不能被解析为日期,这样我就可以填充这些行的Fail
列。强制将替换所有无法解析为NaT日期的值,甚至NAN。即使我没有用NaN替换空格,这也是事实。所以我不确定这将如何帮助确定行?谢谢!Works Great实际上发现了一些没有转换的情况,所以我使用了@Quang Hoang实现。我以前接受的答案是没有捕获所有的非日期,所以我尝试了您的解决方案,效果很好。谢谢