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的错误吗?
答案 0 :(得分:2)
是什么让你认为这是一个错误,而不是定义的行为?
首先:
In [16]: pandas.NaT.year
Out[16]: -1
所以,它在DatetimeIndex
中并不奇怪;这就是NaT
始终有效的方式。
它完全内部一致,并与numpy
和其他地方的许多其他内容一致,使用-1作为(希望无符号)整数类型的特殊值。
是的,-1确实不能用作NaN,因为你可以用它算术并获得非NaN(和不正确的)结果,并且在其他一些情况下它做的很奇怪(试试pandas.NaT.isoformat()
),还有什么其他选择?只要将year
定义为某种numpy
整数类型,就必须返回一个整数值。那么,有哪些选择?
int
或None
。然后调用year
会返回array(dtype=object)
。NaT.year
可以是NaN
。NaT.year
本身的异常,或尝试在array
内执行此操作。他们都以不同的方式吮吸,但最后似乎吸得最少,并且与宇宙中的其他一切最为一致。理想的解决方案可能是在numpy
中使用整数与NaN类型,但这是设计围绕numpy
datetime
的包装器的更大问题...
顺便说一下,值得注意的是numpy
1.6没有datetime64
的NaT值,因此pandas.NaT
实际上映射到datetime64(-1)
,因为同样的道理。现在numpy
1.7已np.datetime64('NaT')
,这可能会改变。但这仍然没有改变整数没有NaN的事实。