熊猫to_datetime格式错误

嗨,老兄

我读了一个包含日期的CSV文件。某些日期可能格式错误,我想找到这些日期。使用以下方法,我希望第二行是NaT但是熊猫似乎忽略了指定的格式,无论我设置infer_datetime_format还是设置exact

import pandas as pd
from io import StringIO

DATA = StringIO("""date
2019 10 07
   2018 10
""")
df = pd.read_csv(DATA)

df['date'] = pd.to_datetime(df['date'], format="%Y %m %d", errors='coerce', exact=True)

结果是

        date
0 2019-10-07
1 2018-10-01

pandas.to_datetime文件指的strftime()和strptime()的行为,但是当我用普通的Python测试它的工作原理:

datetime.datetime.strptime('  2018 10', '%Y %m %d')

我得到期望值错误:

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

我想念什么?

仅供参考:这个问题to_datetime无效,似乎是相关的,但有所不同,并且现在已经解决。我的熊猫版本为0.25.2。

嗨,老兄

这是一个已知的错误,有关详细信息,请参见github

由于我们需要一个解决方案,因此提出了以下解决方法。请注意,在我的问题中,我过去read_csv一直将可复制的代码段保持为较小且简单。我们实际使用的read_fwf是一些示例数据(time.txt):

2019 10 07 + 14:45 15:00  # Foo
2019 10 07 + 18:00 18:30  # Bar
  2019 10 09 + 13:00 13:45  # Wrong indentation

我觉得说行号也是个好主意,所以我增加了一些伏都教:

class FileSanitizer(io.TextIOBase):
    row = 0
    date_range = None

    def __init__(self, iterable, date_range):
        self.iterable = iterable
        self.date_range = date_range

    def readline(self):
        result = next(self.iterable)
        self.row += 1
        try:
            datetime.datetime.strptime(result[self.date_range[0]:self.date_range[1]], "%Y %m %d")
        except ValueError as excep:
            raise ValueError(f'row: {self.row} => {str(excep)}') from ValueError
        return result


filepath = 'time.txt'
colspecs = [[0, 10], [13, 18], [19, 25], [26, None]]
names = ['date', 'start', 'end', 'description']

with open(filepath, 'r') as file:
    df = pd.read_fwf(FileSanitizer(file, colspecs[0]),
                     colspecs=colspecs,
                     names=names,
                     )

解决方案基于此答案。如何在熊猫中使用read_fwf跳过空白行?请注意,这不适用于read_csv

现在,我收到以下预期的错误:

ValueError: row: 3 => time data '  2019 10 ' does not match format '%Y %m %d'

如果有人有更复杂的答案,我很高兴学习。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章