2017-02-01 3 views
1

J'ai une série pandas dans laquelle les données sont de type datetime. Je voudrais le convertir en un index entier unique. Je recherche une commande directe et rapide, car les données sont grandes.Conversion de la série datetime en index entier

Exemple:

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

doit être converti en:

 0 
    0 1 
    1 2 
    3 3 
    4 2 

En fait, je me demande également s'il y a une commande à usage général, qui convertit une série de tout type de données dans une série d'entiers uniques de cette manière.

Répondre

3

Utilisation 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 

Une autre solution possible est rank:

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

minutage sont différentes:

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

*** Je l'aime *** – piRSquared

+0

Remerciez vous, puis-je penser à cela en tant que gen approche du but ultime? C'est-à-dire, également pour tous les autres types de données, non seulement datetime – splinter

+0

Oui, c'est une approche générale, voir [docs] (http://pandas.pydata.org/pandas-docs/stable/reshaping.html#factorizing-values) – jezrael