Конвертировать массив float32 в datetime64 в Numpy 1.6.1 - PullRequest
8 голосов
/ 09 марта 2012

Как правильно преобразовать целочисленные даты в datetime64 в numpy? Я попробовал:

import numpy
a = numpy.array([20090913, 20101020, 20110125])
numpy.datetime64(a.astype("S8"))

но получите неправильное преобразование. Как насчет их правильного чтения как объектов numpy.datetime64 с использованием numpy.loadtxt (они поступают из файла csv)?

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Как ни странно, это работает: numpy.datetime64(a.astype("S8").tolist()), а это не так: numpy.datetime64(a.astype("S8")). Первый метод все еще немного запутаннее, чем: numpy.array([numpy.datetime64(str(i)) for i in a]). Я спросил, почему в этот вопрос .

5 голосов
/ 09 марта 2012

Ваша проблема в том, что 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 отлично работает с или без черточек ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...