2016-12-12 35 views
0

我有一個整數的毫秒數組,我想通過timedelta操作轉換爲Python日期時間數組。NumPy到timedelta的整數數組

下面的MWE的工作原理,但我相信有一個更優雅的方法或更好的性能比乘以1毫秒。

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]') 

我可以生產從time_arr同一陣列np.array(time_arr, dtype='datetime64[us]')

tolist這些datetime64項目轉換爲datetime對象:

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

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速度較快,但與轉化率可能不是最快的。

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

+0

以'%% timeit'檢查,我最初的做法,每循環21.9微秒運行時,你的第一個方法('dt.astype( 'timedelta64 [毫秒]')')運行在每14.1微秒循環和使用'dt.astype('timedelta64 [ms]')'的方法在每個循環中以12.8μs運行 – API

+0

我將放棄轉換到python列表以獲得性能:) – API