pd.Timestamp 与 np.datetime64:它们对于选定的用途是不是可以互换?

Posted

技术标签:

【中文标题】pd.Timestamp 与 np.datetime64:它们对于选定的用途是不是可以互换?【英文标题】:pd.Timestamp versus np.datetime64: are they interchangeable for selected uses?pd.Timestamp 与 np.datetime64:它们对于选定的用途是否可以互换? 【发布时间】:2018-09-20 07:45:50 【问题描述】:

在与pandas 中的DatetimeIndex 进行比较时,此问题的动机是an answer 与question on improving performance。

该解决方案通过df.index.valuesDatetimeIndex 转换为numpy 数组,并将该数组与np.datetime64 对象进行比较。这似乎是从此比较中检索布尔数组的最有效方法。

pandas 的一位开发人员对此问题的反馈是:“这些通常不一样。提供 numpy 解决方案通常是一种特殊情况,不推荐。”

我的问题是:

    它们对于操作的子集是否可以互换?我很感激 DatetimeIndex 提供了更多功能,但我只需要切片和索引等基本功能。 对于可转换为numpy 的操作,结果 中是否存在任何记录差异?

在我的研究中,我发现一些帖子提到“并不总是兼容” - 但它们似乎都没有任何确凿的参考资料/文档,或说明它们通常不兼容的原因/时间。许多其他帖子使用numpy 表示,没有评论。

Pandas DatetimeIndex indexing dtype: datetime64 vs Timestamp How to convert from pandas.DatetimeIndex to numpy.datetime64?

【问题讨论】:

【参考方案1】:

在我看来,您应该始终更喜欢使用 Timestamp - 它可以在需要时轻松转换回 numpy 日期时间。

numpy.datetime64 本质上是int64 的薄包装器。它几乎没有特定日期/时间的功能。

pd.Timestampnumpy.datetime64 的包装器。它由相同的 int64 值支持,但支持整个 datetime.datetime 接口,以及有用的 pandas 特定功能。

这两者的数组内表示是相同的——它是一个连续的 int64 数组。 pd.Timestamp 是一个标量框,可以更轻松地处理单个值。

回到链接的答案,你可以这样写,它更短,而且恰好更快。

%timeit (df.index.values >= pd.Timestamp('2011-01-02').to_datetime64()) & \
        (df.index.values < pd.Timestamp('2011-01-03').to_datetime64())
192 µs ± 6.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

【讨论】:

你的解释很有道理。但我还是很困惑。通常,优化pandas 的途径是下降到numpy [然后可能是numbacython]。是否有特定原因不建议专门针对 pd.Timestamp 该建议虽然在实践中经常有效,但非常简单。 Numpy 本身并不比 pandas 快,更多的是 pandas 经常在内部使用 numpy,所以如果你确切地知道你想要什么,你可以省略一些开销。在这种情况下,无论哪种方式,数组操作都是相同的,只是标量构造更快。

以上是关于pd.Timestamp 与 np.datetime64:它们对于选定的用途是不是可以互换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥调用 '.values' 时 pd.Timestamp 会转换为 np.datetime64?

pandas使用pd.DatetimeIndex函数将混合格式的日期数据(包含字符串datetime对象pd.Timestamp)数据转化为时间索引数据DatetimeIndex

Pandas DateOffset,退后一天

在 Pandas 中为日期添加月份

pandas

Pandas DataFrame.to_excel 错误的日期时间