说,我有datetime
:
given_time = datetime(2013, 10, 8, 0, 0, 33, 945109,
tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60,
name=None))
我想将其转换为np.datetime64
:
np.datetime64(given_time)
> numpy.datetime64('2013-10-08T00:00:33.945109+0100')
效果很好。但是,如果我有一个given_time
数组:
given_times = np.array([given_time]*3) # dtype is object
given_times.astype('datetime64')
和given_times = np.array([given_time] * 3, dtype=np.datetime64)
都会触发TypeError: Cannot cast datetime.datetime object from metadata [us] to [D] according to the rule 'same_kind'
所以,我必须指定单位:
given_times.astype('datetime64[us]')
# or
given_times = np.array([given_time]*3, dtype='datetime64[us]')
我的问题是,为什么我必须在这里指定单位?它不需要np.datatime64
构造函数中的单元。
答案 0 :(得分:6)
我知道这是一个老问题,但我会尝试回答以防其他人遇到这个问题。
numpy
不会尝试自动将date / datetime对象的iterables转换为datetime64数组,这在测试套件中的this excerpt非常清楚:# at the moment, we don't automatically convert these to datetime64
dt = datetime.date(1970, 1, 1)
arr = np.array([dt])
assert_equal(arr.dtype, np.dtype('O'))
dt = datetime.datetime(1970, 1, 1, 12, 30, 40)
arr = np.array([dt])
assert_equal(arr.dtype, np.dtype('O'))
理想情况下,numpy
会认为可以使用具有正确单位的datetime64
;见this问题。
从标量构建datetime64
时,它为日期对象设置为M8[D]
的单位,为日期时间对象a relevant test设置为M8[us]
。
当您指定dtype='datetime64'
或类似地dtype='M8'
时,单位设置为“通用”,稍后会解析为M8[D]
(尽管它可以合乎逻辑让它解析为M8[D]
,请参阅this问题):
>>> np.datetime_data(np.dtype('datetime64'))
('generic', 1)
>>> np.datetime_data(np.dtype('M8'))
('generic', 1)
>>> np.datetime_data(np.dtype('M8[D]'))
('D', 1)
>>> np.datetime_data(np.dtype('M8[us]'))
('us', 1)
given_times.astype('datetime64')
不再引发异常 - 这在1.11中为fixed。
从1.11开始,datetime64对象are timezone-naive,因此传递一个日期时间对象,其tzinfo
设置如同提供的示例一样,将触发弃用警告。