2015-09-04 7 views
0

У меня есть массив numpy, который состоит из значений numpy.datetime64. Я хотел бы преобразовать их в pandas Timestamps с помощью pandas.Timestamp().Применение вызова pandas Timestamp() для каждого элемента массива numpy

я мог бы сделать явным для цикла как

import numpy as np 
import pandas as pd 
stamps = [pd.Timestamp(t) for t in my_arr] 

, но это не очень эффективно. Я могу использовать функцию векторизации Numpy, чтобы сделать что-то вроде этого вместо

stamper = np.vectorize(pd.Timestamp) 
stamps = stamper(my_arr) 

но документация NumPy утверждает, что векторизовать в основном функция удобства и не предназначены для повышения производительности. Есть ли лучший, более эффективный способ сделать это?

Edit: Вот некоторые тайминги от некоторых решений, приведенных:

%timeit stamper(my_arr) 
%timeit my_arr.astype(pd.Timestamp) 
%timeit np.array([pd.Timestamp(t) for t in my_arr]) 
%timeit pd.to_datetime(my_arr) 

100 loops, best of 3: 7.04 ms per loop 
10000 loops, best of 3: 82 µs per loop 
100 loops, best of 3: 16.8 ms per loop 
1000 loops, best of 3: 1.19 ms per loop 

Кажется, что .astype() является самым быстрым, так что я пойду с этим. Благодаря!

+0

Не будет 'pd.DataFrame (my_arr) .to_timest amp() 'делать то, что вы хотите? – EdChum

+0

Эд, похоже, это не так. Когда я попробовал это, у меня получилось, что объект «Int64Index» не имеет атрибута «to_timestamp» « – gammapoint

+0

Извините, попробуйте' pd.DataFrame (my_arr) .to_timestamp (axis = 1) ' – EdChum

ответ

1

Если my_arr является NumPy ndarray, я предложил бы делать:

my_arr.astype(pd.Timestamp) 

Это позволит создать копию массива и приведение его типа вы хотите.

1

Я думаю, вы можете просто использовать векторизованную функцию pd.to_datetime().

Предположит, ваша строка даты и время не является стандартом ISO-формат

my_arr = np.array(['8/28/2015 13:46', '8/27/2015 13:26', '8/27/2015 11:46']) 
my_arr 

array(['8/28/2015 13:46', '8/27/2015 13:26', '8/27/2015 11:46'], 
     dtype='<U15') 

Вызовите Векторизованную функцию pd.to_datetime() с заказным форматом аргументом

dts = pd.to_datetime(my_arr, format='%m/%d/%Y %H:%M') 
dts 

DatetimeIndex(['2015-08-28 13:46:00', '2015-08-27 13:26:00', 
       '2015-08-27 11:46:00'], 
       dtype='datetime64[ns]', freq=None, tz=None) 

Вы можете вычислить разницу между различными метками времени и общим количеством секундами

dts[0] - dts[-1] 

Timedelta('1 days 02:00:00') 

(dts[0] - dts[-1]).total_seconds() 

93600.0