2016-11-30 7 views
6

У меня есть dataframe с некоторыми (сотнями) миллионов строк. И я хочу эффективно преобразовать дату и время в метку времени. Как мне это сделать?Python pandas конвертировать datetime в timestamp эффективно через dt accessor

Мой образец df:

df = pd.DataFrame(index=pd.DatetimeIndex(start=dt.datetime(2016,1,1,0,0,1), 
    end=dt.datetime(2016,1,2,0,0,1), freq='H'))\ 
    .reset_index().rename(columns={'index':'datetime'}) 

df.head() 

      datetime 
0 2016-01-01 00:00:01 
1 2016-01-01 01:00:01 
2 2016-01-01 02:00:01 
3 2016-01-01 03:00:01 
4 2016-01-01 04:00:01 

Теперь я преобразовать DateTime в метку времени значение по значению с .apply(), но это занимает очень много времени (несколько часов), если у меня есть некоторые (сотни) миллионов строк:

df['ts'] = df[['datetime']].apply(lambda x: x[0].timestamp(), axis=1).astype(int) 

df.head() 

      datetime   ts 
0 2016-01-01 00:00:01 1451602801 
1 2016-01-01 01:00:01 1451606401 
2 2016-01-01 02:00:01 1451610001 
3 2016-01-01 03:00:01 1451613601 
4 2016-01-01 04:00:01 1451617201 

Вышеуказанный результат - это то, что я хочу.

Если я пытаюсь использовать .dt аксессор pandas.Series тогда я получаю сообщение об ошибке:

df['ts'] = df['datetime'].dt.timestamp 

AttributeError: 'DatetimeProperties' object has no attribute 'timestamp'

Если я пытаюсь создать, например. финиковые части DateTimes с .dt аксессору тогда гораздо быстрее, чем с помощью .apply():

df['date'] = df['datetime'].dt.date 

df.head() 

      datetime   ts  date 
0 2016-01-01 00:00:01 1451602801 2016-01-01 
1 2016-01-01 01:00:01 1451606401 2016-01-01 
2 2016-01-01 02:00:01 1451610001 2016-01-01 
3 2016-01-01 03:00:01 1451613601 2016-01-01 
4 2016-01-01 04:00:01 1451617201 2016-01-01 

Я хочу что-то подобное с метками времени ...

Но я не очень понимаю, в официальной документации: он говорит о «Converting to Timestamps», но я не вижу никаких временных меток; это просто говорит о переходе на DATETIME с pd.to_datetime(), но не временной метки ...

pandas.Timestamp конструктор также не работает (возвращается с ниже ошибки):

df['ts2'] = pd.Timestamp(df['datetime']) 

TypeError: Cannot convert input to Timestamp

pandas.Series.to_timestamp также делает что-то совершенно другой, который я хочу:

df['ts3'] = df['datetime'].to_timestamp 

df.head() 

      datetime   ts            ts3 
0 2016-01-01 00:00:01 1451602801 <bound method Series.to_timestamp of 0 2016... 
1 2016-01-01 01:00:01 1451606401 <bound method Series.to_timestamp of 0 2016... 
2 2016-01-01 02:00:01 1451610001 <bound method Series.to_timestamp of 0 2016... 
3 2016-01-01 03:00:01 1451613601 <bound method Series.to_timestamp of 0 2016... 
4 2016-01-01 04:00:01 1451617201 <bound method Series.to_timestamp of 0 2016... 

спасибо !!

ответ

6

Я думаю, что вам нужно преобразовать первый в numpy array по values и гипсе на int64 - выход в ns, поэтому нужно разделить на 10 ** 9:

df['ts'] = df.datetime.values.astype(np.int64) // 10 ** 9 
print (df) 
       datetime   ts 
0 2016-01-01 00:00:01 1451606401 
1 2016-01-01 01:00:01 1451610001 
2 2016-01-01 02:00:01 1451613601 
3 2016-01-01 03:00:01 1451617201 
4 2016-01-01 04:00:01 1451620801 
5 2016-01-01 05:00:01 1451624401 
6 2016-01-01 06:00:01 1451628001 
7 2016-01-01 07:00:01 1451631601 
8 2016-01-01 08:00:01 1451635201 
9 2016-01-01 09:00:01 1451638801 
10 2016-01-01 10:00:01 1451642401 
11 2016-01-01 11:00:01 1451646001 
12 2016-01-01 12:00:01 1451649601 
13 2016-01-01 13:00:01 1451653201 
14 2016-01-01 14:00:01 1451656801 
15 2016-01-01 15:00:01 1451660401 
16 2016-01-01 16:00:01 1451664001 
17 2016-01-01 17:00:01 1451667601 
18 2016-01-01 18:00:01 1451671201 
19 2016-01-01 19:00:01 1451674801 
20 2016-01-01 20:00:01 1451678401 
21 2016-01-01 21:00:01 1451682001 
22 2016-01-01 22:00:01 1451685601 
23 2016-01-01 23:00:01 1451689201 
24 2016-01-02 00:00:01 1451692801 

to_timestamp используется для преобразования from period to datetime index.

+1

'df.datetime.values.astype (np.int64)' быстрее – piRSquared

+0

@piRSquared - спасибо. – jezrael

+0

Спасибо! Он преобразует столбец datetime в метку времени, из кадра данных с +300 миллионами строк менее чем за 5 секунд !!! – ragesz

Смежные вопросы