Как получить время UNIX с numpy.datetime64 или numpy.datetime _?
Как и в примере:
np.datetime_('2012-08-08 13:37:00')
Как получить время UNIX с numpy.datetime64 или numpy.datetime _?
Как и в примере:
np.datetime_('2012-08-08 13:37:00')
Я получаю несогласованные результаты для значения 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
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'
и так далее....
Чтобы учесть единицы, я думаю, вам нужно сделать что-то вроде:
def get_unixtime(dt64):
return dt64.astype('datetime64[s]').astype('int')
Обратите внимание, что это преобразование в "секунды" ([s]
) перед преобразованием в целые числа. Это работает на NumPy 1.12.1.
Сначала вы должны знать единицы хранения массива. Затем вы рассматриваете массив как 64-битное целое число и делитесь на соответствующий коэффициент масштабирования, чтобы вернуться к секундам. Например, если ваш массив datetime хранится в единицах хранения микросекунд (dtype=<M8[us]
), вы должны сделать это:
unix_time = dtarray.view("i8") / 1e6
Я хотел опубликовать найденное решение, которое, я думаю, могло бы быть немного лучше, чем сделать преобразование в 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
def get_unixtime(time):
return (time.astype(np.int64)/1e6).astype(np.int64)
get_unixtime(np.datetime64('now'))
Кажется, возвращает временную метку UNIX, я проверил только несколько дат.