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、整数値を返す必要があります。それで、オプションは何ですか?

  • intまたはを返しますNone。を呼び出すとyear、 が返されますarray(dtype=object)
  • フロートを返すのでNaT.yearNaN.
  • それ自体で例外を発生さNaT.yearせるか、array.
  • 特別な整数値を返します。-1 でない場合、どの値を使用しますか?

それらはすべてさまざまな方法でうまくいきませんが、最後のものは最もうまくいかず、宇宙の他のすべてのものと最も一致しているようです. 理想的な解決策は、NaN 型の整数を に含めることかもしれませんがnumpy、それは s のラッパーを設計するよりもはるかに大きな問題numpy datetimeです…</p>

ところで、numpy1.6 には の NaT 値がないことに注意してください。まったく同じ理由でdatetime64pandas.NaT実際には にマップされます。1.7 に が追加されたので、変更される可能性がありdatetime64(-1)ます。しかし、それでも整数に NaN がないという事実は変わりません。numpynp.datetime64('NaT')

于 2012-12-31T21:54:04.023 に答える