在 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')
我有一个以长度分隔的源文件。我的文件如下所示:
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')