0
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 是一个错误吗?

4

1 回答 1

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,你会使用什么值?

它们都以不同的方式吸吮,但最后一种似乎吸吮最少,并且与宇宙中的其他一切都最一致。理想的解决方案可能是在 中包含 integer-with-NaN 类型numpy,但这是一个更大的问题,即围绕numpy datetimes 设计包装器......</p>

顺便说一句,值得注意的是numpy1.6 没有 的 NaT 值datetime64,因此 apandas.NaT实际上映射到datetime64(-1),原因完全相同。现在numpy1.7 有了np.datetime64('NaT'),这可能会改变。但这仍然不能改变整数没有 NaN 的事实。

于 2012-12-31T21:54:04.023 回答