У меня есть 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...
спасибо !!
'df.datetime.values.astype (np.int64)' быстрее – piRSquared
@piRSquared - спасибо. – jezrael
Спасибо! Он преобразует столбец datetime в метку времени, из кадра данных с +300 миллионами строк менее чем за 5 секунд !!! – ragesz