代码之家  ›  专栏  ›  技术社区  ›  jpp

pd。时间戳与np。datetime64:它们是否可以在选定的用途中互换?

  •  13
  • jpp  · 技术社区  · 8 年前

    这个问题的动机是 an answer 到a question on improving performance 与进行比较时 DatetimeIndex 在里面 pandas .

    解决方案转换 日期时间索引 到a numpy 阵列通过 df.index.values 并将数组与 np.datetime64 对象这似乎是从比较中检索布尔数组的最有效方法。

    的一位开发人员对此问题的反馈 熊猫 was:“一般来说,这些都不一样。提供numpy解决方案通常是一种特例,不推荐。”

    我的问题是:

    1. 对于操作子集,它们是否可互换?我很感激 日期时间索引 提供更多功能,但我只需要切片和索引等基本功能。
    2. 是否有记录在案的差异 后果 对于可转换为的操作 努比 ?

    在我的研究中,我发现一些帖子提到“不总是兼容的”,但似乎没有任何一个帖子有任何确凿的参考文献/文档,也没有具体说明为什么/何时通常不兼容。许多其他帖子使用 努比 无注释的表示。

    1 回复  |  直到 8 年前
        1
  •  12
  •   Ben    5 年前

    在我看来,你应该总是喜欢使用 Timestamp -如果需要,它可以很容易地转换回numpy datetime。

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

    pd.Timestamp 是包裹在 努比。日期时间64 . 它由相同的int64值支持,但支持整个 datetime.datetime 接口,以及有用的熊猫特定功能。

    这两个数组中的表示形式是相同的——它是一个INT64的连续数组。 pd。时间戳 是一个标量框,可以更轻松地处理单个值。

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

    %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)