2017-02-01 3 views
1

У меня есть серия pandas, в которой данные являются типами datetime. Я хотел бы преобразовать его в уникальный целочисленный индекс. Я ищу прямую, быструю команду, поскольку данные большие.Преобразование даты и времени Серия в целочисленный индекс

Пример:

  0 
    0 2015-07-05 
    1 2015-07-12 
    3 2015-07-19 
    4 2015-07-12 

должны быть преобразованы в:

 0 
    0 1 
    1 2 
    3 3 
    4 2 

На самом деле, я тоже интересно, есть ли команда общего назначения, которая преобразует серию любой таким образом, тип данных в серию уникальных целых чисел.

ответ

3

Использование factorize:

s = pd.Series(['2015-07-05', '2015-07-12', '2015-07-19', '2015-07-12'], name=0) 
print (s) 
0 2015-07-05 
1 2015-07-12 
2 2015-07-19 
3 2015-07-12 
Name: 0, dtype: object 

s1 = pd.Series(pd.factorize(s)[0] + 1, s.index) 
print (s1) 
0 1 
1 2 
3 3 
4 2 
dtype: int64 

Другим возможным решением является rank:

s1 = s.rank(method='dense').astype(int) 
print (s1) 
0 1 
1 2 
2 3 
3 2 
Name: 0, dtype: int32 

Timings различны:

s = pd.concat([s]*100000).reset_index(drop=True) 

In [78]: %timeit (pd.Series(pd.factorize(s)[0] + 1, s.index)) 
100 loops, best of 3: 13.9 ms per loop 

In [79]: %timeit (s.rank(method='dense').astype(int)) 
1 loop, best of 3: 536 ms per loop 
+0

*** Мне нравится *** – piRSquared

+0

Спасибо вы, я могу думать об этом как о гене подход с общей целью? То есть также для всех других типов данных не только datetime – splinter

+0

Да, это общий подход, см. [Docs] (http://pandas.pydata.org/pandas-docs/stable/reshaping.html#factorizing-values) – jezrael

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