numpy
имеет свои собственные datetime
и timedelta
форматов. Просто используйте их;).
Set-до, например:
import datetime
import numpy
times = numpy.array([datetime.timedelta(0, 1, 36000)])
Код:
times.astype("timedelta64[ms]").astype(int)/1000
#>>> array([ 1.036])
Так как люди, кажется, не понимают, что это самое лучшее решение, вот некоторые моменты времени timedelta64
массива против datetime.datetime
массив:
SETUP="
import datetime
import numpy
times = numpy.array([datetime.timedelta(0, 1, 36000)] * 100000)
numpy_times = times.astype('timedelta64[ms]')
"
python -m timeit -s "$SETUP" "numpy_times.astype(int)/1000"
python -m timeit -s "$SETUP" "numpy.vectorize(lambda x: x.total_seconds())(times)"
python -m timeit -s "$SETUP" "[delta.total_seconds() for delta in times]"
Результаты:
100 loops, best of 3: 4.54 msec per loop
10 loops, best of 3: 99.5 msec per loop
10 loops, best of 3: 67.1 msec per loop
Первоначальный перевод займет примерно два раза больше времени, как векторизованное выражение, но каждая операция с тогдашним на в бессрочный на этом timedelta
массива будет примерно в 20 раз быстрее.
Если вы никогда не будете использовать те timedelta
s снова, подумайте, спросите себя, почему вы когда-либо делали дельты (в отличие от timedelta64
с), в первую очередь, а затем использовать выражение numpy.vectorize
. Он менее родной, но по какой-то причине он быстрее.
Почему бы не использовать 'x.seconds' в' lambda'? Кроме того, если массив представляет собой плоский одномерный массив, это 'map (lambda x: x.total_seconds(), dt)' быстрее? – wflynny
уверен и прав (нужно было бы преобразовать список в массив в конце). – prgao
Я не знал о векторизации ... какая полезная функция! Благодаря! – ccbunney