NumPy 整数数组到 timedelta

API*_*API 4 datetime numpy python-3.x pandas

我有一个整数毫秒的 numpy 数组,我想通过 timedelta 操作将其转换为 Python 日期时间数组。

以下 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)
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 6

所以你的方法产生:

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)
Run Code Online (Sandbox Code Playgroud)

等效的使用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]')
Run Code Online (Sandbox Code Playgroud)

我可以从你的time_arrwith生成相同的数组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)]
Run Code Online (Sandbox Code Playgroud)

或将其包装回数组中以获取您的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)
Run Code Online (Sandbox Code Playgroud)

只是因为计算datatime64速度更快,但随着转换,它可能不是整体最快的。

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