2017-08-27 7 views
2

は私がdatetime.maxでシリーズを作成する場合は、シリーズのDTYPEがまた突然オブジェクトのすべてのPythonでは、datetime.maxをシリーズに挿入すると、シリーズのタイプが変更されますか?

pd.Series([datetime(2012, 8, 1), datetime(2013, 4, 1), datetime.max]) 
Out[50]: 
0   2012-08-01 00:00:00 
1   2013-04-01 00:00:00 
2 9999-12-31 23:59:59.999999 
dtype: object 

の方法である、

import pandas as pd 
from datetime import datetime 

pd.Series([datetime(2012, 8, 1), datetime(2013, 4, 1), datetime(2013, 8, 1)]) 
Out[49]: 
0 2012-08-01 
1 2013-04-01 
2 2013-08-01 
dtype: datetime64[ns] 

しかし、いくつかのランダムな日付からシリーズを作成します日付が変更されて表示されます。この後者の点は、シリーズが現在オブジェクトであるという事実に関連していると思います。

datetime.maxはここで何が起こっているか他の日付

type(datetime.max) 
Out[53]: datetime.datetime 

type(datetime(2014, 1,1)) 
Out[54]: datetime.datetime 

と同じタイプのですか?どのようにして 'max'-datetime値を含む系列を作成できますか?この

0 2012-08-01 
1 2013-04-01 
2 9999-12-31 
dtype: datetime64[ns] 
+0

なぜdownvoteですか? – mortysporty

答えて

4

同様datetime64[ns] DTYPEは1678 AD and 2262 AD間の日付を表すことができます。 datetime.maxがこの範囲外にあるため、Seriesのdtypeはobjectに変更され、すべての値はdatetime.datetimeに変換され、シリーズに必要な日付時刻の範囲を保持できるようになりました。

現在、ナノ秒周波数datetime64[ns] DTYPEは(datetime64[s]、言うは対照的に、またはdatetime64[Y]only NumPy datetime dtype that Pandas supportsです。 recommended workarounddatetime64[ns]で表現可能な範囲外の日付を表すためにpd.Periodまたはpd.PeriodIndexオブジェクトを使用することです:

import datetime as DT 
import pandas as pd 
s = pd.Series([DT.datetime(2012, 8, 1), DT.datetime(2013, 4, 1), DT.datetime.max]) 
p = s.apply(lambda x: pd.Period(x, freq='D')) 
print(p) 

利回り

0 2012-08-01 
1 2013-04-01 
2 9999-12-31 
dtype: object 

freqパラメータが展開するns よりも大きな何かに設定しなければならないことに注意してください日付の許容範囲(粒度の犠牲を払って)。 freqパラメータにはtable of common aliasesを使用できます。

+0

Aha!ありがとうございました。しかし、他の日付のデフォルトタイプとしてdatetime64が選択されているのはなぜですか。 – mortysporty

+1

NumPyの 'datetime64'を使用すると、高速でベクトル化された日時演算が可能です。したがって、Pandas NDFrameのdatetime値のdtypeが優先されます。 – unutbu

+0

強制的に 'datetime'を選択する方法はありますか?私は 'date'を認識していますが、それにはいくつかの問題があります。https://stackoverflow.com/questions/45899340/in-python-rowwise-min-and-max-fails-when-containing-a-nan – mortysporty

関連する問題