为何未指定us单位时datetime.datetime转np.datetime64仅保留日期?
问题解答:datetime64单位推断的差异是设计逻辑而非Bug
我来给你捋清楚这个问题——这绝对不是Bug,而是numpy在不同场景下处理datetime64单位推断的设计逻辑差异,核心原因在于输入数据类型和数组创建/转换方式的不同:
1. 两种场景的核心差异
官方文档示例:从字符串直接创建datetime64数组
当你直接用字符串数组创建datetime64数组(指定dtype='datetime64')时,numpy会自动解析字符串里的时间精度,选择能覆盖所有输入最高精度的单位。比如文档里的示例字符串包含毫秒级信息,numpy就会推断用datetime64[ms]作为单位,自然保留了完整的时间精度。
代码示例:
>>> np.array(['2001-01-01T12:00', '2002-02-03T13:56:03.172'], dtype='datetime64') array(['2001-01-01T12:00:00.000-0600', '2002-02-03T13:56:03.172-0600'], dtype='datetime64[ms]')
你的测试:从Python datetime对象转换
你的代码是先创建一个包含Python datetime.datetime对象的object数组,再通过astype('datetime64')转换。在numpy 1.14版本中,这种转换如果不指定单位,默认会使用天([D])作为单位,因此时间部分被截断,只保留日期信息。
你的测试代码:
import numpy as np import datetime print(np.array([datetime.datetime(2018, 5, 15, 6, 0),datetime.datetime(2018, 5, 15, 6, 30)]).astype('datetime64[us]')) print(np.array([datetime.datetime(2018, 5, 15, 6, 0),datetime.datetime(2018, 5, 15, 6, 30)]).astype('datetime64'))
输出:
['2018-05-15T06:00:00.000000' '2018-05-15T06:30:00.000000'] ['2018-05-15' '2018-05-15']
2. 背后的设计逻辑
- 从字符串创建时,numpy的优先级是尽可能保留输入的所有时间信息,所以会根据字符串的精度自动匹配最适合的单位。
- 从Python datetime对象转换时,早期numpy版本(包括1.14.x)的设计是默认采用最粗的通用单位(天),如果你需要保留时分秒甚至更细的精度,必须显式指定单位(比如
datetime64[us])——这是为了避免隐式转换带来的精度意外,同时保持转换逻辑的简洁性。
简单来说,两种场景的单位推断逻辑是为了适配不同输入源的特性而设计的,并非Bug。
内容的提问来源于stack exchange,提问作者kakk11
相关产品推荐
相关产品推荐

