Python 将datetime.max插入系列会更改系列类型

Python 将datetime.max插入系列会更改系列类型,python,pandas,datetime,Python,Pandas,Datetime,我根据一些随机日期创建了一个系列 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的

我根据一些随机日期创建了一个系列

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
的序列,那么序列的数据类型会突然变成一个对象

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]

datetime64[ns]
dtype可以表示两个日期之间的日期。由于
datetime.max
不在此范围内,因此序列的数据类型更改为
object
,所有值都转换为
datetime.datetime
s,以便序列可以保持所需的日期时间范围

目前,纳秒频率
datetime64[ns]
dtype(与之相反,
datetime64[s]
datetime64[Y]
)是最短的。使用
pd.Period
pd.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
参数的参数。

Aha!非常感谢。但是为什么选择datetime64作为其他日期的默认类型。使用NumPy
datetime64
s可以实现快速、矢量化的日期时间算法。因此,它是NDFrame日期时间值的首选数据类型。有没有办法强制它选择普通的
datetime
?我知道
date
,但这还有一些其他问题,熊猫会在可能的情况下自动将包含
datetime.datetime
的系列或数据帧转换为NumPy
datetime64[ns]
dtype。不幸的是,我所知道的防止转换的唯一方法就是像上面那样做——插入像
datetime.max
这样的对象,它不能转换为
datetime64[ns]