Numpy 奇怪行为转换为 datetime64 dtype

Ben*_*min 2 python datetime numpy

import numpy
a = numpy.array([20090913, 20101020, 20110125])
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么numpy.datetime64(a.astype("S8").tolist())转换正确但不转换吗numpy.datetime64(a.astype("S8"))?为什么 numpy 函数不接受 numpy 字符串而只接受常规 python 字符串?我正在使用 Numpy 1.6.1 和 Python 2.7.2 Windows 7。

MrG*_*mez 5

重现您的结果:

>>> a = numpy.array([20090913, 20101020, 20110125])

>>> numpy.datetime64(a.astype("S8").tolist())
array([2009-09-13 00:00:00, 2010-10-20 00:00:00, 2011-01-25 00:00:00], dtype=datetime64[us])

>>> numpy.datetime64(a.astype("S8"))
array([1970-01-01 00:00:20.090913, 1970-01-01 00:00:20.101020,
       1970-01-01 00:00:20.110125], dtype=datetime64[us])
Run Code Online (Sandbox Code Playgroud)

关键是:

>>> a.astype("S8").tolist()
['20090913', '20101020', '20110125']
>>> a.astype("S8")
array(['20090913', '20101020', '20110125'],
      dtype='|S8')
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,字符串参数被传递numpy.datetime64并正确解析,正如您所描述的那样。|S8在第二种情况下,它需要根据猜测执行显式强制。事实证明,正在考虑这一点,但目前明确不支持

这没有进入,因为将日期时间属性转换为 datetime64 后,数组中不存在日期时间属性,因此可能会产生一些不直观的后果。当 Martin 实现四元数 dtype 时,我们讨论了 dtypes 可以公开显示在数组对象上的属性的可能性,如果实现了这一点,我认为 python datetime 和 datetime64 之间的转换和兼容性可以变得非常自然。

该文档提供了您可能希望考虑的更多工作强制示例,包括来自其他 numpy 时间格式的强制示例。如果您认为显式类型强制的需要是错误的,我建议将其报告给 numpy 团队,并在可能的情况下提交您自己的补丁。