在 pd.read_fwf 中使用的转换器中处理 datetime.strptime 中的 NaN 值(零值)

Handle NaN values (zero value) in datetime.strptime in a converter used in pd.read_fwf

我有一个以长度分隔的源文件。我的文件如下所示:

00;12345678;03122019
01;12345678;00000000

到目前为止我的代码如下:

import pandas as pd
from datetime import datetime

col_lengths = {'Column1': range(0, 2), 
               'Column2': range(3, 11), 
               'Datecolumn': range(12, 20),
              }
col_lengths = {k: set(v) for k, v in col_lengths.items()}

pd.read_fwf(r'D:\test.txt', colspecs=[(min(x), max(x)+1) for x in col_lengths.values()], header=None, names=col_lengths.keys(), 
           converters={'Column1':lambda x : str(x),
                       'Column2':lambda x : str(x),
                       'Datecolumn': lambda s: datetime.strptime(s, '%d%m%Y'),
                      }
           )

这里的问题是我的文件的第二行出现错误:

ValueError: time data '00000000' does not match format '%d%m%Y'

处理这个问题的正确方法/好方法是什么?到目前为止,我还没有这方面的经验。对我来说唯一的选择是将它作为一个字符串,然后在 pandas 数据帧中尝试转换它。但是如果有一种优雅的方式可以直接在这里处理这个问题,我想使用它。我想知道如何在这里即时处理它,这是否是个好主意?

您可以使用 pandas.to_datetime 作为转换器:

#converters={...
             'Datecolumn': lambda s: pd.to_datetime(s, format='%d%m%Y', errors='coerce'),
#            }

输出:

  Column1   Column2 Datecolumn
0      00  12345678 2019-12-03
1      01  12345678        NaT
备选

将列读取为 str 然后转换:

df['Datecolumn'] = pd.to_datetime(df['Datecolumn'], format='%d%m%Y', errors='coerce')