2017-02-01 2 views
1

私はデータがdatetimeタイプの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 

タイミングが異なっている:

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

関連する問題