9

というnumpy配列がありdtます。各要素の型はdatetime.timedeltaです。例えば:

>>>dt[0]
datetime.timedelta(0, 1, 36000)

ループせずに秒だけを含むdt配列に変換するにはどうすればよいですか? dt_sec私の現在の解決策(これは機能しますが、好きではありません)は次のとおりです。

dt_sec = zeros((len(dt),1))
for i in range(0,len(dt),1):
    dt_sec[i] = dt[i].total_seconds()

私は使用しようとしましdt.total_seconds()たが、もちろんうまくいきませんでした。このループを回避する方法について何か考えはありますか?

ありがとう

4

5 に答える 5

13

numpy独自のdatetimeフォーマットがありtimedeltaます。それらを使用するだけです;)。

セットアップ例:

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

最初の変換には、ベクトル化された式の約 2 倍の時間がかかりますが、そのtimedelta配列に対するその後の各操作は、約 20 倍速くなります。


これらの s を二度と使用しない場合は、最初timedeltaに ( s ではなく) デルタを作成した理由を自問してから、式を使用することを検討してください。ネイティブではありませんが、何らかの理由で高速です。timedelta64numpy.vectorize

于 2013-09-26T21:41:48.900 に答える
11
import numpy as np

helper = np.vectorize(lambda x: x.total_seconds())
dt_sec = helper(dt)
于 2013-09-26T21:38:09.817 に答える
0

prgaonp.vectorizeで提案されているように使用するのが好きです。Python リストだけが必要な場合は、次のこともできます。

dt_sec = map(datetime.timedelta.total_seconds, dt)
于 2013-09-26T21:46:02.520 に答える
-3

「リスト内包表記」を使用できます。

dt_sec = [delta.total_seconds() for delta in dt]

舞台裏では、numpy はそれをかなり高速な操作に変換する必要があります。

于 2013-09-26T21:40:04.513 に答える