Как получить временную метку unix из numpy.datetime64

Как получить время UNIX с numpy.datetime64 или numpy.datetime _?

Как и в примере:

np.datetime_('2012-08-08 13:37:00')

Ответ 1

Я получаю несогласованные результаты для значения np.datetime64('now') на numpy 1.6.1 против 1.7.

Это работает на обоих:

>>> import datetime
>>> import numpy as np
>>> now = np.datetime64(datetime.datetime.now())
>>> (now.astype('uint64') / 1e6).astype('uint32')
1344447810

Ответ 2

numpy datetime64 имеет переменные единицы измерения:

Извлечено из официального документа:

Единица внутреннего хранения автоматически выбирается из формы строки и может быть либо датой, либо единицей времени. Единицами даты являются годы ('Y), месяцы (' M), недели ('W) и дни (' D), а единицами времени являются часы ('h), минуты (' m), секунды ('s)), миллисекунды (мс) и некоторые дополнительные единицы на основе секунд с префиксом SI.

Итак, сначала нам нужно проверить текущий модуль, используя dtype, например:

>>> now = np.datetime64(datetime.datetime.now())
>>> now.dtype

# for ns unit, use:
dtype('<M8[ns]')
now.astype('int64')/1e9, dtype='int32'

# for us unit, use:
dtype('<M8[us]')
now.astype('int64')/1e6, dtype='int32'

# for ms unit, use:
dtype('<M8[ms]')
now.astype('int64')/1e3, dtype='int32'

и так далее....

Ответ 3

Чтобы учесть единицы, я думаю, вам нужно сделать что-то вроде:

def get_unixtime(dt64):
    return dt64.astype('datetime64[s]').astype('int')

Обратите внимание, что это преобразование в "секунды" ([s]) перед преобразованием в целые числа. Это работает на NumPy 1.12.1.

Ответ 4

Сначала вы должны знать единицы хранения массива. Затем вы рассматриваете массив как 64-битное целое число и делитесь на соответствующий коэффициент масштабирования, чтобы вернуться к секундам. Например, если ваш массив datetime хранится в единицах хранения микросекунд (dtype=<M8[us]), вы должны сделать это:

unix_time = dtarray.view("i8") / 1e6

Ответ 5

Я хотел опубликовать найденное решение, которое, я думаю, могло бы быть немного лучше, чем сделать преобразование в uint, так как я чувствую, что в этом преобразовании типов могут быть проблемы.

>>> import numpy as np
>>> now = np.datetime64('now')
>>> ux_time = now.astype(np.timedelta64) / np.timedelta64(1, 'ms')

Я чувствую, что это решение немного лучше, поскольку оно позволяет вам выбирать единицы времени для Unix. Для проекта, над которым я работаю, мы используем 'ms', но вы можете указать другой блок, если это необходимо.

Кроме того, это позволяет использовать массив datetime64 для преобразования в timedelta64 с использованием numpy:

>>> date_time_array.astype(np.timedelta64) / np.timedelta64(1, 'ms')

Я использую это для перевода столбцов np.datetime64, взятых из панд, в массивы unixtime

Ответ 6

def get_unixtime(time):    
    return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))

Кажется, возвращает временную метку UNIX, я проверил только несколько дат.