熊猫NaT到-1?

时间:2012-12-31 20:22:17

标签: python timestamp pandas

In [22]: ts
Out[22]:
<class 'pandas.tseries.index.DatetimeIndex'>
[NaT, ..., 2012-12-31 00:00:00]
Length: 11, Freq: None, Timezone: None

In [23]: ts.year
Out[23]: array([  -1, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012])

使用apply以及

时会发生这种情况
ts.apply(lambda x: pd.Timestamp(x).year)

0       -1
1     2012
2     2012
3     2012
4     2012
5     2012
6     2012
7     2012
8     2012
9     2012
10    2012
Name: Dates

这是NaT.year == -1的错误吗?

1 个答案:

答案 0 :(得分:2)

是什么让你认为这是一个错误,而不是定义的行为?

首先:

In [16]: pandas.NaT.year
Out[16]: -1

所以,它在DatetimeIndex中并不奇怪;这就是NaT始终有效的方式。

它完全内部一致,并与numpy和其他地方的许多其他内容一致,使用-1作为(希望无符号)整数类型的特殊值。

是的,-1确实不能用作NaN,因为你可以用它算术并获得非NaN(和不正确的)结果,并且在其他一些情况下它做的很奇怪(试试pandas.NaT.isoformat() ),还有什么其他选择?只要将year定义为某种numpy整数类型,就必须返回一个整数值。那么,有哪些选择?

  • 返回intNone。然后调用year会返回array(dtype=object)
  • 返回一个浮点数,因此NaT.year可以是NaN
  • 提出NaT.year本身的异常,或尝试在array内执行此操作。
  • 返回一些特殊的整数值。如果不是-1,你会使用什么价值?

他们都以不同的方式吮吸,但最后似乎吸得最少,并且与宇宙中的其他一切最为一致。理想的解决方案可能是在numpy中使用整数与NaN类型,但这是设计围绕numpy datetime的包装器的更大问题...

顺便说一下,值得注意的是numpy 1.6没有datetime64的NaT值,因此pandas.NaT实际上映射到datetime64(-1),因为同样的道理。现在numpy 1.7已np.datetime64('NaT'),这可能会改变。但这仍然没有改变整数没有NaN的事实。