2015-11-23 19 views
5

Ho un dataframe contenente log di errori di sei mesi, raccolti ogni giorno. Voglio recuperare gli ultimi record di 30 giorni dall'ultima data. L'ultimo appuntamento non è oggi.
Ad esempio: ho dati per i mesi maggio, giugno, luglio e fino al August 15, desidero recuperare i dati da August 15 a July 15 rendendolo record di 30 giorni.
C'è un modo per farlo in Python Pandas?Python - Recupero degli ultimi 30 giorni di dati da dataframe panda

Questa è la dataframe campione:

Error_Description   Date  Weekend  Type 
N17739 Limit switch X- 5/1/2015 5/3/2015 Critical 
N17739 Limit switch Y- 5/1/2015 5/3/2015 Critical 
N938 Key non-functional 5/1/2015 5/3/2015 Non-Critical 
P124 Magazine is running 5/1/2015 5/3/2015 Non-Critical 
N17738 Limit switch Z+ 5/1/2015 5/3/2015 Critical 
N938 Key non-functional 5/1/2015 5/3/2015 Non-Critical 
    ...     ...   ...   ... 
P873 ENCLOSURE DOOR  8/24/2015 8/30/2015 Non-Critical 
N3065 Reset M114   8/24/2015 8/30/2015 Non-Critical 
N3065 Reset M114,   8/24/2015 8/30/2015 Non-Critical 
N2853 Synchronization  8/24/2015 8/30/2015 Critical 
P152 ENCLOSURE   8/24/2015 8/30/2015 Non-Critical 
N6236 has stopped   8/24/2015 8/30/2015 Critical 
+0

Si può solo tagliare la df.iloc df '[:: 30]' no? – EdChum

+0

@EdChum probabilmente intendi 'df.iloc [-30:]'? –

+1

@AntonProtopopov op vuole generare blocchi di 30 giorni in modo che dipenda, 'df.iloc [-30:] prende solo le ultime 30 voci – EdChum

risposta

4

Data lastdayfrom è utilizzato per selezionare gli ultimi 30 giorni di DataFrame dalla funzione loc.

lastdayfrom = pd.to_datetime('8/24/2015') 
print lastdayfrom 
#2015-08-24 00:00:00 

print df 
#   Error_Description  Date Weekend   Type 
#0  N17739 Limit switch X- 2015-05-01 2015-05-03  Critical 
#1  N17739 Limit switch Y- 2015-05-01 2015-05-03  Critical 
#2 N938 Key non-functional 2015-05-01 2015-05-03 Non-Critical 
#3 P124 Magazine is running 2015-05-01 2015-05-03 Non-Critical 
#4  N17738 Limit switch Z+ 2015-02-01 2015-05-03  Critical 
#5 N938 Key non-functional 2015-07-25 2015-05-03 Non-Critical 
#6  P873 ENCLOSURE DOOR 2015-07-24 2015-08-30 Non-Critical 
#7   N3065 Reset M114 2015-07-21 2015-08-21 Non-Critical 
#8   N3065 Reset M114, 2015-08-22 2015-08-22 Non-Critical 
#9  N2853 Synchronization 2015-08-23 2015-08-30  Critical 
#10   P152 ENCLOSURE 2015-08-24 2015-08-30 Non-Critical 
#11   N6236 has stopped 2015-08-24 2015-08-30  Critical 

print df.dtypes 
#Error_Description   object 
#Date     datetime64[ns] 
#Weekend    datetime64[ns] 
#Type       object 
#dtype: object 

#set index from column Date 
df = df.set_index('Date') 
#if datetimeindex isn't order, order it 
df= df.sort_index() 

#last 30 days of date lastday 
df = df.loc[lastdayfrom - pd.Timedelta(days=30):lastdayfrom].reset_index() 
print df 
#  Date  Error_Description Weekend   Type 
#0 2015-07-25  N3065 Reset M114 2015-08-21 Non-Critical 
#1 2015-08-22  N3065 Reset M114, 2015-08-22 Non-Critical 
#2 2015-08-23 N2853 Synchronization 2015-08-30  Critical 
#3 2015-08-24   P152 ENCLOSURE 2015-08-30 Non-Critical 
#4 2015-08-24  N6236 has stopped 2015-08-30  Critical 
1

È possibile utilizzare DataFrame.last_valid_index() per trovare l'etichetta dell'ultima linea, e quindi sottrarre DateOffset(30, 'D') andare indietro di 30 giorni:

df[df.last_valid_index()-pandas.DateOffset(30, 'D'):] 
+0

(supponendo che l'indice sia un DatetimeIndex ...) – faltarell

+0

Non è chiaro quale sia l'indice nell'esempio, ma per utilizzare la soluzione che ho proposto sopra è necessario impostare la colonna Data come indice: df2 = df.reset_index () .set_index ('Data') – faltarell

Problemi correlati