我从一些随机日期创建了一个系列
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]
答案 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 supports。 recommended workaround是使用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
的值
扩展允许的日期范围(以更小的粒度为代价)。
您可以使用table of common aliases freq
参数。