在Python中,将datetime.max插入一个系列更改了系列的类型?

时间:2017-08-27 10:09:40

标签: 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创建一个系列,那么该系列的dtype突然变成了一个对象

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]

1 个答案:

答案 0 :(得分:4)

datetime64[ns] dtype可以表示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 supportsrecommended 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的值 扩展允许的日期范围(以更小的粒度为代价)。 您可以使用table of common aliases freq参数。