Ваша проблема в том, что datetime64
ожидает строку в формате yyyy-mm-dd
, в то время как преобразование типа создает строки в формате yyyymmdd
. Я бы предложил что-то вроде этого:
conversion = lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:])
np_conversion = numpy.frompyfunc(conversion,1,1)
b = np_conversion(a.astype('S10'))
numpy.datetime64(b)
Однако это не работает для меня (у меня numpy 1.6.1), оно завершается с сообщением «NotImplementedError: Не реализовано для этого типа». Если это не реализовано в 1.7, я могу предложить только чисто Python-решение:
numpy.datetime64(numpy.array([conversion(str(x)) for x in a], dtype="S10"))
... или предварительно обработав ваш ввод, чтобы доставить даты в ожидаемом формате.
Редактировать: Я также могу предложить альтернативное решение, используя vectorize
, но я не очень хорошо знаю, как оно работает, поэтому я не знаю, что происходит не так:
>>> conversion = vectorize(lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:]), otypes=['S10'])
>>> conversion(a.astype('S10'))
array(['2009', '2010', '2011'],
dtype='|S4')
Почему-то игнорируется otypes
и выводится |S4
вместо |S10
. Извините, я не могу больше помочь, но это должно послужить отправной точкой для поиска других решений.
Обновление: Благодаря обратной связи с OP, я подумал о новой возможности. Это должно работать как ожидалось:
>>> conversion = lambda x: numpy.datetime64(str(x))
>>> np_conversion = numpy.frompyfunc(conversion, 1, 1)
>>> np_conversion(a)
array([2009-09-13 00:00:00, 2010-10-20 00:00:00, 2011-01-25 00:00:00], dtype=object)
# Works too:
>>> conversion = lambda x: numpy.datetime64("%s-%s-%s" % (x/10000, x/100%100, x%100))
Странно, как в этом случае datetime64
отлично работает с или без черточек ...