2016-12-12 10 views
0

timedelta操作でPythonのdatetimesの配列に変換する整数のミリ秒単位の配列があります。timedeltaにNumPyの整数配列

次のMWEが機能しますが、1msの乗算よりも優れたパフォーマンスが得られると確信しています。

start = pd.Timestamp('2016-01-02 03:04:56.789101').to_pydatetime() 
dt = np.array([  19, 14980, 19620, 54964615, 54964655, 86433958]) 
time_arr = start + dt * timedelta(milliseconds=1) 

答えて

1

だからあなたのアプローチは、生産:

In [56]: start = pd.Timestamp('2016-01-02 03:04:56.789101').to_pydatetime() 
In [57]: start 
Out[57]: datetime.datetime(2016, 1, 2, 3, 4, 56, 789101) 
In [58]: dt = np.array([  19, 14980, 19620, 54964615, 54964655, 86433958]) 
In [59]: time_arr = start + dt * timedelta(milliseconds=1) 
In [60]: time_arr 
Out[60]: 
array([datetime.datetime(2016, 1, 2, 3, 4, 56, 808101), 
     datetime.datetime(2016, 1, 2, 3, 5, 11, 769101), 
     datetime.datetime(2016, 1, 2, 3, 5, 16, 409101), 
     datetime.datetime(2016, 1, 2, 18, 21, 1, 404101), 
     datetime.datetime(2016, 1, 2, 18, 21, 1, 444101), 
     datetime.datetime(2016, 1, 3, 3, 5, 30, 747101)], dtype=object) 

同等np.datetime64種類の使用:

In [61]: dt.astype('timedelta64[ms]') 
Out[61]: array([  19, 14980, 19620, 54964615, 54964655, 86433958], dtype='timedelta64[ms]') 
In [62]: np.datetime64(start) 
Out[62]: numpy.datetime64('2016-01-02T03:04:56.789101') 
In [63]: np.datetime64(start) + dt.astype('timedelta64[ms]') 
Out[63]: 
array(['2016-01-02T03:04:56.808101', '2016-01-02T03:05:11.769101', 
     '2016-01-02T03:05:16.409101', '2016-01-02T18:21:01.404101', 
     '2016-01-02T18:21:01.444101', '2016-01-03T03:05:30.747101'], dtype='datetime64[us]') 

を私はnp.array(time_arr, dtype='datetime64[us]')であなたのtime_arrから同じ配列を生成することができます。

In [97]: t1=np.datetime64(start) + dt.astype('timedelta64[ms]') 
In [98]: t1.tolist() 
Out[98]: 
[datetime.datetime(2016, 1, 2, 3, 4, 56, 808101), 
datetime.datetime(2016, 1, 2, 3, 5, 11, 769101), 
datetime.datetime(2016, 1, 2, 3, 5, 16, 409101), 
datetime.datetime(2016, 1, 2, 18, 21, 1, 404101), 
datetime.datetime(2016, 1, 2, 18, 21, 1, 444101), 
datetime.datetime(2016, 1, 3, 3, 5, 30, 747101)] 

たりtime_arrを取得するには、アレイでそれをバックラップ:

tolistdatetimeオブジェクトにこれらdatetime64項目に変換するだけ計算に

In [99]: np.array(t1.tolist()) 
Out[99]: 
array([datetime.datetime(2016, 1, 2, 3, 4, 56, 808101), 
     ... 
     datetime.datetime(2016, 1, 3, 3, 5, 30, 747101)], dtype=object) 

datatime64高速ですが、とコンバージョンは、全体的に最速ではない可能性があります。 `%% timeit`チェックと

https://docs.scipy.org/doc/numpy/reference/arrays.datetime.html

+0

、私の最初のアプローチは、ループあたり21.9マイクロ秒で走る、あなたの最初のアプローチ(' dt.astype( 'timedelta64 [ミリ秒]') ')あたり14.1マイクロ秒で実行されます'dt.astype( 'timedelta64 [ms]')'を使ったアプローチはループごとに12.8μsで実行されます – API

+0

私は性能のためにpythonリストに変換をドロップします:) – API

関連する問題