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

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

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

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

我的问题是:

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

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

【问题讨论】:

    标签: python arrays pandas numpy datetime


    【解决方案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,所以如果你确切地知道你想要什么,你可以省略一些开销。在这种情况下,无论哪种方式,数组操作都是相同的,只是标量构造更快。
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多