2017-08-27 12 views
2

我創建一個從一些隨機日期的系列在Python中,將datetime.max插入一個序列會改變序列的類型?

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,該系列的D型是突然的對象

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 

也順便日期顯示更改。我想這後一點與這個系列現在是一個對象有關。

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] D型可以1678 AD and 2262 AD之間表示日期。由於datetime.max位於此範圍之外,因此係列的dtype更改爲object,並將所有值轉換爲datetime.datetime s,以便該系列可以保存所需的日期時間範圍。

當前納秒頻率datetime64[ns] dtype(與之相對,datetime64[s]datetime64[Y])是only NumPy datetime dtype that Pandas supports。的recommended workaround是使用pd.Periodpd.PeriodIndex對象通過datetime64[ns]來代表範圍可表示以外的日期:

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

啊哈!謝謝。但爲什麼選擇datetime64作爲其他日期的默認類型。 – mortysporty

+1

快速的向量化日期時間算法可以使用NumPy'datetime64's。所以它是大熊貓NDFrame日期時間值的首選dtype。 – unutbu

+0

有沒有辦法強制它選擇純日期時間?我知道'日期',但有一些其他問題https://stackoverflow.com/questions/45899340/in-python-rowwise-min-and-max-fails-when-containing-a-nan – mortysporty