为什么pandas在调用pd.to_datetime()时返回时间戳而不是datetime对象?

18 投票
1 回答
11425 浏览
提问于 2025-04-18 07:04

根据手册pd.to_datetime()应该是用来创建一个日期时间对象的。

但是,当我调用pd.to_datetime("2012-05-14")时,却得到了一个时间戳对象!而当我对这个对象再调用to_datetime()时,才最终得到了一个日期时间对象。

In [1]: pd.to_datetime("2012-05-14")
Out[1]: Timestamp('2012-05-14 00:00:00', tz=None)

In [2]: t = pd.to_datetime("2012-05-14")
In [3]: t.to_datime()
Out[2]: datetime.datetime(2012, 5, 14, 0, 0)

这种意外的行为有什么解释吗?

1 个回答

22

Timestamp 对象是 pandas 处理日期时间的方式,所以它在 pandas 中就是一个日期时间对象。不过,你可能期待的是 datetime.datetime 对象。
通常你不需要太在意这个(这只是表现形式不同)。只要你在使用 pandas,Timestamp 就没问题。即使你真的想要一个 datetime.datetime 对象,大部分情况下也能正常使用(比如所有的方法),如果不行,你可以用 to_pydatetime 来获取 datetime.datetime 对象。

更详细的解释:

  • pandas 将日期时间存储为类型为 datetime64 的数据在索引或列中(这些并不是 datetime.datetime 对象)。这是 numpy 对日期时间的标准类型,性能比使用 datetime.datetime 对象要好:

     In [15]: df = pd.DataFrame({'A':[dt.datetime(2012,1,1), dt.datetime(2012,1,2)]})
    
     In [16]: df.dtypes
     Out[16]:
     A    datetime64[ns]
     dtype: object
    
     In [17]: df.loc[0,'A']
     Out[17]: Timestamp('2012-01-01 00:00:00', tz=None)
    
  • 当你从这样的日期时间列或索引中获取一个值时,你会看到一个 Timestamp 对象。这个对象在处理日期时间时更方便(有更多的方法,表现更好等,比 datetime64 更好),而且它是 datetime.datetime 的子类,因此也具备所有 datetime.datetime 的方法。

撰写回答