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.values
将DatetimeIndex
转换为numpy
数组,并将该数组与np.datetime64
对象进行比较。这似乎是从此比较中检索布尔数组的最有效方法。
pandas
的一位开发人员对此问题的反馈是:“这些通常不一样。提供 numpy 解决方案通常是一种特殊情况,不推荐。”
我的问题是:
-
它们对于操作的子集是否可以互换?我很感激
DatetimeIndex
提供了更多功能,但我只需要切片和索引等基本功能。
对于可转换为numpy
的操作,结果 中是否存在任何记录差异?
在我的研究中,我发现一些帖子提到“并不总是兼容” - 但它们似乎都没有任何确凿的参考资料/文档,或说明它们通常不兼容的原因/时间。许多其他帖子使用numpy
表示,没有评论。
【问题讨论】:
【参考方案1】:在我看来,您应该始终更喜欢使用 Timestamp
- 它可以在需要时轻松转换回 numpy 日期时间。
numpy.datetime64
本质上是int64
的薄包装器。它几乎没有特定日期/时间的功能。
pd.Timestamp
是numpy.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
[然后可能是numba
或cython
]。是否有特定原因不建议专门针对 pd.Timestamp
?
该建议虽然在实践中经常有效,但非常简单。 Numpy 本身并不比 pandas 快,更多的是 pandas 经常在内部使用 numpy,所以如果你确切地知道你想要什么,你可以省略一些开销。在这种情况下,无论哪种方式,数组操作都是相同的,只是标量构造更快。以上是关于pd.Timestamp 与 np.datetime64:它们对于选定的用途是不是可以互换?的主要内容,如果未能解决你的问题,请参考以下文章
为啥调用 '.values' 时 pd.Timestamp 会转换为 np.datetime64?
pandas使用pd.DatetimeIndex函数将混合格式的日期数据(包含字符串datetime对象pd.Timestamp)数据转化为时间索引数据DatetimeIndex