Python панды эффективно конвертировать datetime в метку времени через DT accessor
у меня есть фрейм данных с некоторыми (сотнями) миллионов строк. И я хочу эффективно преобразовать datetime в timestamp. Как я могу это сделать?
мой пример 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' не имеет атрибута 'timestamp'
если я попытаюсь создать, например. дата части datetimes с .dt accessor тогда это намного быстрее, чем с помощью .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
я хочу что-то подобное с метками времени...
но я не очень понимаю официальную документацию: она говорит о "преобразование в Метки" но я не вижу там никаких временных меток; он просто говорит о преобразовании в datetime с pd.to_datetime() но не с timestamp...
pandas.Timestamp конструктор также не работает (возвращает с ошибкой ниже):
df['ts2'] = pd.Timestamp(df['datetime'])
TypeError: не удается преобразовать входные данные в отметку времени
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...
спасибо!!
1 ответов
Я думаю, вам нужно сначала преобразовать в numpy array by 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 используется для преобразования от периода к индексу datetime.
