PDEP-4: 一致的日期时间解析

摘要

建议是

动机和范围

Pandas 日期解析非常灵活,但可以说过于灵活 - 请参阅 https://github.com/pandas-dev/pandas/issues/12585 和链接的问题,了解这会导致多少混乱。Pandas 可以中途切换格式,虽然这已记录在案,但它经常违反用户的预期。

简单示例

In [1]: pd.to_datetime(['12-01-2000 00:00:00', '13-01-2000 00:00:00'])
Out[1]: DatetimeIndex(['2000-12-01', '2000-01-13'], dtype='datetime64[ns]', freq=None)

用户几乎肯定打算将数据读取为“1 月 12 日,1 月 13 日”。但是,它被读取为“12 月 1 日,1 月 13 日”。没有发出警告或错误。

目前,确保一致解析的唯一方法是显式传递 format=。参数 infer_datetime_format 不严格,可以与 format 一起调用,并且仍然可能违反用户的预期

In [2]: pd.to_datetime(['12-01-2000 00:00:00', '13-01-2000 00:00:00'], infer_datetime_format=True)
Out[2]: DatetimeIndex(['2000-12-01', '2000-01-13'], dtype='datetime64[ns]', freq=None)

详细描述

具体来说,建议是

如果用户具有混合格式的日期,他们仍然可以使用灵活的解析并接受它带来的风险,例如

In [3]: pd.to_datetime(['12-01-2000 00:00:00', '13-01-2000 00:00:00'], format='mixed')
Out[3]: DatetimeIndex(['2000-12-01', '2000-01-13'], dtype='datetime64[ns]', freq=None)

或者,如果他们的日期都是ISO8601,

In [4]: pd.to_datetime(['2020-01-01', '2020-01-01 03:00'], format='ISO8601')
Out[4]: DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 03:00:00'], dtype='datetime64[ns]', freq=None)

使用和影响

我预计影响将是积极的

据我所知,没有引入错误的可能性。

实现

whatsnew 笔记中写道

在下一个主要版本发布 2.0 中,正在考虑对几个较大的 API 进行更改,但没有正式的弃用。

我建议将此更改作为上述更改的一部分,因为

请注意,这并不意味着要删除dateutil.parser,因为它仍然会在guess_datetime_format中使用。但是,根据此提案,后续行将使用推断的格式进行解析,而不是重复调用dateutil.parser并冒着它静默切换格式的风险

最后,函数from pandas._libs.tslibs.parsing import guess_datetime_format将在pandas.tools下公开。

超出范围

我们可以通过使用元素的随机样本推断格式来使guess_datetime_format更智能。

PDEP 历史