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

Posted

技术标签:

【中文标题】为啥 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象?【英文标题】:Why does pandas return timestamps instead of datetime objects when calling pd.to_datetime()?为什么 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象? 【发布时间】:2014-07-08 10:34:12 【问题描述】:

根据manual,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】:

Timestamp 对象是 pandas 处理日期时间的方式,因此它 pandas 中的日期时间对象。但您期望的是 datetime.datetime 对象。 通常你不应该关心这个(这只是一个不同的代表问题)。只要您使用熊猫,时间戳就可以了。即使你真的想要一个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 的子类,它的所有方法也是如此。

【讨论】:

以上是关于为啥 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象?的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥标签与 pandas、itertools 和 numpy 索引不一致?

使用 numpy.max/ numpy.min 作为时间戳值

为啥 Pandas 串联 (pandas.concat) 的内存效率如此之低?

为啥在 Alpine Linux 上安装 Pandas 需要很长时间

Pandas:为啥在布尔索引后需要双括号来选择列