2014-11-13 11 views
6

ecco un dati di serie storiche come questo, lo chiamano df:Come usare i panda per trovare stessi dati consecutivi in ​​serie temporali

 'No'  'Date'  'Value' 
0  600000  1999-11-10 1 
1  600000  1999-11-11 1 
2  600000  1999-11-12 1 
3  600000  1999-11-15 1 
4  600000  1999-11-16 1 
5  600000  1999-11-17 1 
6  600000  1999-11-18 0 
7  600000  1999-11-19 1 
8  600000  1999-11-22 1 
9  600000  1999-11-23 1 
10 600000  1999-11-24 1 
11 600000  1999-11-25 0 
12 600001  1999-11-26 1 
13 600001  1999-11-29 1 
14 600001  1999-11-30 0 

voglio ottenere l'intervallo di date del consecutiva 'Valore' di 1 , così come posso ottenere il risultato finale come segue:

'No'  'BeginDate' 'EndDate' 'Consecutive' 
0 600000 1999-11-10 1999-11-17 6 
1 600000 1999-11-19 1999-11-24 4 
2 600001 1999-11-26 1999-11-29 2 
+0

che cosa hai fatto? – acushner

+0

Ciao acushner: cosa vuoi sapere? – figo

+0

Quindi, deludente, nessuno risponde. – figo

risposta

10

Questo dovrebbe farlo

df['value_grp'] = (df.Values.diff(1) != 0).astype('int').cumsum() 

value_grp incrementerà da un whenev er Cambia valore. Qui di seguito, è possibile estrarre il gruppo si traduce

pd.DataFrame({'BeginDate' : df.groupby('value_grp').Date.first(), 
       'EndDate' : df.groupby('value_grp').Date.last(), 
       'Consecutive' : df.groupby('value_grp').size(), 
       'No' : df.groupby('value_grp').No.first()}).reset_index(drop=True) 
+0

Ciao utente1827356, thans per la tua risposta veloce, ma il risultato non è lo stesso di quello che voglio, puoi vedere il risultato che elenco sotto la tua risposta. – figo

+0

@figo, mio ​​male. Si è verificato un errore nel calcolo value_grp. Puoi ricontrollare? Puoi filtrare su Consecutive> 1 per la tua risposta esatta – user1827356

+0

Adesso va bene, grazie mille! – figo

0

Ecco una soluzione alternativa:

rslt = (df.assign(Consecutive=df.Value 
           .groupby((df.Value != df.Value.shift()) 
             .cumsum()) 
           .transform('size')) 
      .query('Consecutive > 1') 
      .groupby('Consecutive') 
      .agg({'No':{'No':'first'}, 'Date': {'BeginDate':'first', 'EndDate':'last'}}) 
      .reset_index() 
) 
rslt.columns = [t[1] if t[1] else t[0] for t in rslt.columns] 

Demo:

In [225]: %paste 
rslt = (df.assign(Consecutive=df.Value 
           .groupby((df.Value != df.Value.shift()) 
             .cumsum()) 
           .transform('size')) 
      .query('Consecutive > 1') 
      .groupby('Consecutive') 
      .agg({'No':{'No':'first'}, 'Date': {'BeginDate':'first', 'EndDate':'last'}}) 
      .reset_index() 
) 
rslt.columns = [t[1] if t[1] else t[0] for t in rslt.columns] 
## -- End pasted text -- 

In [226]: rslt 
Out[226]: 
    Consecutive BeginDate EndDate  No 
0   2 1999-11-26 1999-11-29 600001 
1   4 1999-11-19 1999-11-24 600000 
2   6 1999-11-10 1999-11-17 600000 
Problemi correlati