2016-06-14 3 views
2

Prenons l'exemple simple ci-dessous:comment obtenir la valeur d'index décalée d'une base de données dans Pandas?

date = pd.date_range('1/1/2011', periods=5, freq='H') 

df = pd.DataFrame({'cat' : ['A', 'A', 'A', 'B', 
         'B']}, index = date) 
df 
Out[278]: 
        cat 
2011-01-01 00:00:00 A 
2011-01-01 01:00:00 A 
2011-01-01 02:00:00 A 
2011-01-01 03:00:00 B 
2011-01-01 04:00:00 B 

Je veux créer une variable qui contient la valeur retardée/plomb de l'indice. C'est quelque chose comme:

df['index_shifted']=df.index.shift(1) 

Ainsi, par exemple, au moment 2011-01-01 01:00:00 je me attendre à être 2011-01-01 00:00:00

Comment puis-je faire la variable index_shifted qui? Merci!

+0

df.index donne 'etc etc '13/06/2016 16:29:00'], DTYPE = 'datetime64 [ns] ', length = 2471070, freq = None) 'Est-ce un problème? –

Répondre

5

Je pense que vous avez besoin Index.shift avec -1:

df['index_shifted']= df.index.shift(-1) 
print (df) 
        cat  index_shifted 
2011-01-01 00:00:00 A 2010-12-31 23:00:00 
2011-01-01 01:00:00 A 2011-01-01 00:00:00 
2011-01-01 02:00:00 A 2011-01-01 01:00:00 
2011-01-01 03:00:00 B 2011-01-01 02:00:00 
2011-01-01 04:00:00 B 2011-01-01 03:00:00 

Pour moi, il fonctionne sans freq, mais peut-être il est nécessaire en temps réel des données:

df['index_shifted']= df.index.shift(-1, freq='H') 
print (df) 
        cat  index_shifted 
2011-01-01 00:00:00 A 2010-12-31 23:00:00 
2011-01-01 01:00:00 A 2011-01-01 00:00:00 
2011-01-01 02:00:00 A 2011-01-01 01:00:00 
2011-01-01 03:00:00 B 2011-01-01 02:00:00 
2011-01-01 04:00:00 B 2011-01-01 03:00:00 

EDIT:

Si freq de DatetimeIndex est None, vous devez ajouter freq-shift:

import pandas as pd 

date = pd.date_range('1/1/2011', periods=5, freq='H').union(pd.date_range('5/1/2011', periods=5, freq='H')) 


df = pd.DataFrame({'cat' : ['A', 'A', 'A', 'B', 
         'B','A', 'A', 'A', 'B', 
         'B']}, index = date) 

print (df.index) 
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00', 
       '2011-01-01 02:00:00', '2011-01-01 03:00:00', 
       '2011-01-01 04:00:00', '2011-05-01 00:00:00', 
       '2011-05-01 01:00:00', '2011-05-01 02:00:00', 
       '2011-05-01 03:00:00', '2011-05-01 04:00:00'], 
       dtype='datetime64[ns]', freq=None) 

df['index_shifted']= df.index.shift(-1, freq='H') 
print (df) 
        cat  index_shifted 
2011-01-01 00:00:00 A 2010-12-31 23:00:00 
2011-01-01 01:00:00 A 2011-01-01 00:00:00 
2011-01-01 02:00:00 A 2011-01-01 01:00:00 
2011-01-01 03:00:00 B 2011-01-01 02:00:00 
2011-01-01 04:00:00 B 2011-01-01 03:00:00 
2011-05-01 00:00:00 A 2011-04-30 23:00:00 
2011-05-01 01:00:00 A 2011-05-01 00:00:00 
2011-05-01 02:00:00 A 2011-05-01 01:00:00 
2011-05-01 03:00:00 B 2011-05-01 02:00:00 
2011-05-01 04:00:00 B 2011-05-01 03:00:00 
1

Qu'est-ce qui ne va pas avec df['index_shifted']=df.index.shift(-1)?

(question véritable, pas sûr si je raté quelque chose)

+0

Je reçois 'ValueError: Je ne peux pas déplacer sans freq' –

+1

@Noobie: bizarre, ça marche bien localement. Quel est le résultat de 'df.index.freq'? Il devrait être ''. –

+0

s'il vous plaît regarder mon commentaire ci-dessus –