Pandas.to_datetime函数默默失败

7

我在使用pandas的to_datetime函数以及处理pandas中的日期时间方面遇到了一些困难。具体来说,当应用于pandas系列时,to_datetime会默默地失败而不做任何事情,我必须显式地逐个迭代每个值才能使该函数正常工作,尽管(至少根据这个SO问题)两者应该是一样的。

In [81]: np.__version__
Out[81]: '1.6.1'

In [82]: pd.__version__
Out[82]: '0.12.0'

In [83]: a[0:10]
Out[83]: 
0    8/31/2013 14:57:00
1    8/31/2013 13:55:00
2    8/31/2013 15:45:00
3     9/1/2013 13:26:00
4     9/1/2013 13:56:00
5     9/2/2013 13:55:00
6     9/3/2013 13:33:00
7     9/3/2013 14:11:00
8     9/3/2013 14:35:00
9     9/4/2013 14:28:00
Name: date_time, dtype: object

In [84]: a[0]
Out[84]: '8/31/2013 14:57:00'

In [85]: a=pd.to_datetime(a)

In [86]: a[0]
Out[86]: '8/31/2013 14:57:00'

In [87]: a=[pd.to_datetime(date) for date in a]

In [88]: a[0]
Out[88]: Timestamp('2013-08-31 14:57:00', tz=None)

你有什么想法吗?总的来说,我在处理这个数据和日期时间列时遇到了一些问题,我怀疑这可能与这个失败有关。

谢谢,

Dave


它适用于 pd.to_datetime(a[0:10]) 吗? - waitingkuo
这对我来说似乎可以使用numpy 1.7和pandas 0.12。 - joris
请考虑升级到numpy 1.7.1版本。 - Jeff
嗯,我在我的Mac上似乎遇到了Numpy版本之间的冲突,即预安装的系统版本和我的PIP版本之间的冲突。一旦我解决了这个问题,我会在这里回复...谢谢! - DaveA
2
你可以尝试使用 pd.to_datetime(s, errors='raise') 吗?给其他答案加1以升级。 - Andy Hayden
@AndyHayden,没错,就是这个问题。该列中有一个格式不正确的日期导致整个转换失败! - DaveA
2个回答

5

这个问题在新版的pandas中已经得到修复,默认的errors参数值为'raise'而不是'ignore'。

新的行为表现为:

In [21]: pd.to_datetime(dates)  # same as errors='raise'
...
ValueError: Given date string not likely a datetime.

In [22]: pd.to_datetime(dates, errors="ignore")  # the original problem
Out[22]:
0    1/1/2014
1           A
dtype: object

也就是说,to_datetime 不再默默失败了!

以下是旧答案...


正如 DaveA 指出的那样(在检查我的评论后),如果出现问题,默认情况下 to_datetime 会默默失败并返回最初传递的内容:

In [1]: dates = pd.Series(['1/1/2014', 'A'])

In [2]: pd.to_datetime(dates)  # doesn't even convert first date
Out[2]: 
0    1/1/2014
1           A
dtype: object

In [3]: pd.to_datetime(dates, errors='raise')
...
ValueError: Given date string not likely a datetime.

注意:在早期版本的 pandas 中,此参数曾为 coerce=True
In [4]: pd.to_datetime(dates, errors='coerce')
Out[4]: 
0   2014-01-01
1          NaT
dtype: datetime64[ns]

可以在文档的时间序列部分中了解有关to_datetime此行为的讨论。

您可以通过检查isnull来查看未能解析的日期:

In [5]: dates[pd.isnull(pd.to_datetime(dates, errors='coerce'))]
Out[5]: 
1    A
dtype: object

1
Pandas.to_datetime 函数会默默失败,并在失败时返回原始值。仅一个格式错误的输入就可能导致整个过程默默失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接