2016-12-12 36 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