【问题标题】:Inserting a datetime.max into a pandas series changes the series type将 datetime.max 插入 pandas 系列会更改系列类型
【发布时间】:2017-08-27 10:09:39
【问题描述】:

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

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

这里发生了什么?如何创建包含“最大”日期时间值的系列?像这样

0   2012-08-01
1   2013-04-01
2   9999-12-31
dtype: datetime64[ns]

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    datetime64[ns] dtype 可以表示1678 AD and 2262 AD 之间的日期。由于datetime.max 不在此范围内,因此将Series 的dtype 更改为object,并将所有值转换为datetime.datetimes,以便Series 可以保持所需的日期时间范围。

    目前纳秒频率的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 参数。

    【讨论】:

    • 啊哈!谢谢你。但是为什么选择 datetime64 作为其他日期的默认类型。
    • 使用 NumPy datetime64s 可以实现快速、矢量化的日期时间算法。所以它是 Pandas NDFrame 日期时间值的首选 dtype。
    • 有没有办法强制它选择普通的datetime?我知道date 但还有一些其他问题stackoverflow.com/questions/45899340/…
    • Pandas 会自动将包含 datetime.datetime 的 Series 或 DataFrames 转换为 NumPy datetime64[ns] dtype——如果可能的话。不幸的是,我知道防止转换的唯一方法是按照您上面所做的那样 - 插入像 datetime.max 这样无法转换为 datetime64[ns] 的对象。
    猜你喜欢
    • 1970-01-01
    • 2020-10-19
    • 2016-10-03
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2022-01-06
    • 2014-06-24
    • 2021-05-19
    相关资源
    最近更新 更多