2013-07-17 24 views
13

C'è un modo migliore di bdate_range() per misurare giorni lavorativi tra due colonne di date tramite panda?Il conteggio dei giorni lavorativi tra due serie

df = pd.DataFrame({ 'A' : ['1/1/2013', '2/2/2013', '3/3/2013'], 
'B': ['1/12/2013', '4/4/2013', '3/3/2013']}) 
print df 
df['A'] = pd.to_datetime(df['A']) 
df['B'] = pd.to_datetime(df['B']) 
f = lambda x: len(pd.bdate_range(x['A'], x['B'])) 
df['DIFF'] = df.apply(f, axis=1) 
print df 

con produzione di:

  A   B 
0 1/1/2013 1/12/2013 
1 2/2/2013 4/4/2013 
2 3/3/2013 3/3/2013 
        A     B DIFF 
0 2013-01-01 00:00:00 2013-01-12 00:00:00  9 
1 2013-02-02 00:00:00 2013-04-04 00:00:00 44 
2 2013-03-03 00:00:00 2013-03-03 00:00:00  0 

Grazie!

+0

Eventuale duplicato: http://stackoverflow.com/questions/13019719/get-business-days-between-start-and-end-date-using-pandas (vedere il fondo per il conteggio dei giorni, anziché elencarli.) –

+0

@DanAllan ci si sente come se stesse facendo lo stesso però, nel senso che si sta creando un intervallo di date intermedio ... tuttavia potrebbe non essere possibile ble senza farlo. : s –

+0

Sì, sicuramente. Se stai studiando le lunghe distanze e hai solo bisogno di escludere i fine settimana (ma non le vacanze), mi aspetto che sarebbe più veloce costruire una funzione personalizzata che utilizzi i giorni della settimana per A e B e la loro differenza totale nel tempo per calcolare il numero di giorni lavorativi. –

risposta

11

brian_the_bungler era sul modo più efficace di fare busday_count questo usando del NumPy:

import numpy as np 
A = [d.date() for d in df['A']] 
B = [d.date() for d in df['B']] 
df['DIFF'] = np.busday_count(A, B) 
print df 

Sulla mia macchina questo è 300x più veloce sul banco di prova, e 1000s di volte più veloce su molto più grandi array di date

+1

Una sintassi alternativa e più concisa a [Antonbass] [1] è questa: '' 'df ['DIFF'] = np.busday_count (df ['A']. Tolist(), df ['B'] ToList()) '' ' o ' '' df [ 'DIFF'] = np.busday_count (df.index.date.tolist(), df [ 'B']. ToList()) '' ' se si utilizza l'indice come colonna della data. [1]: https://stackoverflow.com/users/2834466/antonbass – tsando

Problemi correlati