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

mor*_*rty 2 python datetime pandas

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

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]
Run Code Online (Sandbox Code Playgroud)

但是,如果我用 a 创建一个系列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 
Run Code Online (Sandbox Code Playgroud)

日期的显示方式也发生了变化。我想后一点与该系列现在是一个对象的事实有关。

datetime.max 与其他日期的类型相同

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

type(datetime(2014, 1,1))
Out[54]: datetime.datetime
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?如何创建包含 'max'-datetime 值的系列?像这样

0   2012-08-01
1   2013-04-01
2   9999-12-31
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

datetime64[ns]D型细胞可代表之间的日期AD 1678和AD 2262。由于datetime.max位于此范围之外,因此系列的 dtype 已更改为object并将所有值转换为datetime.datetimes,以便系列可以保存所需的日期时间范围。

目前,纳秒频率datetime64[ns]dtype(而不是说datetime64[s],,或datetime64[Y])是Pandas 支持唯一 NumPy 日期时间 dtype。该建议的解决方法是使用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)
Run Code Online (Sandbox Code Playgroud)

产量

0   2012-08-01
1   2013-04-01
2   9999-12-31
dtype: object
Run Code Online (Sandbox Code Playgroud)

请注意,该freq参数必须设置为大于ns 扩展允许的日期范围(以较小的粒度为代价)。以下是可用于参数的常用别名表freq