如何检测日期并转换为datetime64数据类型

2024-04-28 23:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用pandas.read_csv从csv读取数据。其中一列有不同格式的日期信息(没有标准iso8601或类似的)。我想确保Pandas可以检测到日期格式,而不需要用户进一步输入。说实话,我真的不知道怎么开始。我知道Pandas可以infer_datetime_format,但是它不能捕获所有的数据变化,或者可能会抛出错误。

我的数据集有几百万行,所以这个过程非常耗时。我的想法是只加载前100行(nrows=100),然后让函数检测日期格式。从我目前看到的数据集来看,可能是dd-mm-yy,dd-mm-yyy,yyyy-mm-dd(和,.-分隔符的不同变体),1月19日,2019年1月1日,等等。我还有英语(12月)和德语(Dezember)的文本。

我考虑过对列中的每个项运行一个for循环,准备不同格式的案例,也许在tryexcept块中,让Pyton检测前100个条目的正确格式。(使用日期格式从:https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior生成不同的案例)

这种方法有道理吗?或者你会怎么做?提前谢谢!


Tags: csv数据用户信息pandasread标准datetime
2条回答

当您让它尝试推断格式时,pd.to_datetime可以慢一个数量级。对于混合格式,您可以尝试多次解析它:

import pandas as pd
from functools import reduce
                           # dd-mm-yy    dd-mm-YYYY    YYYY-mm-dd
df = pd.DataFrame({'date': ['12-01-01', '12-01-2001', '2001-07-05',
                            'Jan 19', 'January 2019', '1 January 2019']})

代码:

^{pr2}$

一般来说,如果指定dayfirst,那么{}可以灵活地解析大多数格式。尽管这仍然比尝试用指定的格式解析它几次要慢。在

pd.to_datetime(df.date, errors='coerce', dayfirst=True)
#0   2001-01-12
#1   2001-01-12
#2   2001-07-05
#3          NaT
#4   2019-01-01
#5   2019-01-01
#Name: date, dtype: datetime64[ns]

df = pd.concat([df]*10000, ignore_index=True)
%timeit reduce(lambda l,r: l.combine_first(r), [pd.to_datetime(df.date, format=fmt, errors='coerce') for fmt in formats])
#287 ms ± 2.35 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit pd.to_datetime(df.date, errors='coerce', dayfirst=True)
#5.79 s ± 36.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

因此,即使多次尝试解析它,您仍然会获得巨大的成功,而且您不会错过一些非标准格式。在

您可以试试dateparser,它支持用多种语言解析日期。在

根据他们的文件:

>>> # parsing ambiguous date
>>> parse('02-03-2016')  # assumes english language, uses MDY date order
datetime.datetime(2016, 3, 2, 0, 0)
>>> parse('le 02-03-2016')  # detects french, uses DMY date order
datetime.datetime(2016, 3, 2, 0, 0)

相关问题 更多 >