如何检查错误的日期时间条目(python/pandas)?

Luu*_*v93 3 python datetime pandas

我有一个 excel 数据集,其中包含员工输入的工作时间的日期时间值。现在快年底了,他们想报告它,但它充满了错误的条目。因此我需要清理它。

以下是一些错误条目的示例。

面对此类数据集时,您的方法是什么?

我首先使用将日期列转换为日期时间 df['Shiftdatum'] = pd.to_datetime(df.Shiftdatum, format='%Y-%m-%d', errors='coerce')

在下面的示例数据中,它显示了一个 NaT

如何过滤掉这些 NaT,包括行的索引?

[Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 Timestamp('2019-03-11 00:00:00'),
 NaT,
 Timestamp('2019-03-12 00:00:00')

Run Code Online (Sandbox Code Playgroud)

初始样本数据:

{0: '2019-03-11 00:00:00',
 1: '2019-03-11 00:00:00',
 2: '2019-03-11 00:00:00',
 3: '2019-03-11 00:00:00',
 4: '2019-03-11 00:00:00',
 5: '2019-03-11 00:00:00',
 6: '2019-03-11 00:00:00',
 7: '2019-03-11 00:00:00',
 8: '2019-03-11 00:00:00',
 9: '2019-03-11 00:00:00',
 10: '2019-03-11 00:00:00',
 11: '2019-03-11 00:00:00',
 12: '2019-03-11 00:00:00',
 13: '2019-03-11 00:00:00',
 14: '2019-03-11 00:00:00',
 15: '2019-03-11 00:00:00',
 16: '33/11/2019',
 17: '2019-03-12 00:00:00',
 18: '2019-03-12 00:00:00',
 19: '2019-03-12 00:00:00'}
Run Code Online (Sandbox Code Playgroud)

Dat*_*ice 5

国际大学联盟,

您可以通过多种方式处理此问题,您可以使用pd.to_datetime(column,errors='coerce')数据并将其分配给新列

然后使用新列,您可以过滤NaT并获得唯一的异常值,

可以说这是结果:

data = ['033-10-2019', '100-03-2019','1003-03-2019','03-10-2019']

df = pd.DataFrame({'date_time' : data})
df['correct'] = pd.to_datetime(df['date_time'],errors='coerce')
print(df)
       date_time    correct
0   033-10-2019        NaT
1   100-03-2019        NaT
2  1003-03-2019        NaT
3    03-10-2019 2019-03-10
Run Code Online (Sandbox Code Playgroud)

现在 - 我们需要在date_timecol 中获取唯一的 NaT 值

errors = df.loc[df['correct'].isnull()]['date_time'].unique().tolist()
out : ['033-10-2019', '100-03-2019', '1003-03-2019']
Run Code Online (Sandbox Code Playgroud)

这是无聊的一点,您需要检查并修复错误并将正确的值传递给字典:

correct_dict = {'033-10-2019' : '03-10-2019', '100-03-2019' : '03-10-2019', '1003-03-2019' : '10-03-2019'}
Run Code Online (Sandbox Code Playgroud)

然后将值映射回您的数据帧:

df['correct'] = df['correct'].fillna(pd.to_datetime(df['date_time'].map(correct_dict)))
print(df)
      date_time    correct
0   033-10-2019 2019-03-10
1   100-03-2019 2019-03-10
2  1003-03-2019 2019-10-03
3    03-10-2019 2019-03-10
Run Code Online (Sandbox Code Playgroud)

如果您只想删除 NaT 值,您可以dropna在对列进行子集化的同时

df = df.dropna(subset=['correct'])
Run Code Online (Sandbox Code Playgroud)