2013-07-17 15 views
13

Gibt es eine bessere Möglichkeit als bdate_range(), Werktage zwischen zwei Datumsspalten über Pandas zu messen?Die Werktage zwischen zwei Serien zählen

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 

mit einer Leistung von:

  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 

Dank!

+0

Mögliche Duplikate: http://stackoverflow.com/questions/13019719/get-business-days-between-start-and-end-date-using-pandas (Siehe unten, um die Tage zu zählen, anstatt sie aufzulisten.) –

+0

@DanAllan es fühlt sich an, als ob das dasselbe tut, in dem Sinne, dass Sie einen intermediären Zeitraum erstellen ... aber es ist vielleicht nicht möglich ohne das zu tun. : s –

+0

Ja, definitiv. Wenn Sie lange Entfernungen studieren und nur Wochenenden (aber keine Feiertage) ausschließen müssen, erwarte ich, dass es schneller wäre, eine benutzerdefinierte Funktion zu erstellen, die die Wochentage für A und B und deren gesamte Zeitdifferenz für die Berechnung verwendet die Anzahl der Geschäftstage. –

Antwort

11

brian_the_bungler war auf die effizienteste Art und Weise dies mit numpy der busday_count tun:

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 

Auf meinem Rechner ist dies 300x schneller auf Ihrem Testfall, und 1000s-mal schneller auf viel größere Arrays von Terminen

+1

Eine alternative und prägnantere Syntax zu [Antonbass] [1] ist diese: '' 'df ['DIFF'] = np.busday_count (df ['A']. Tolist(), df ['B'] .ToList()) '' ' oder ' '' df [ 'DIFF'] = np.busday_count (df.index.date.tolist() df [ 'B']. ToList()) '' ' wenn der Index als Datumsspalte verwendet wird. [1]: https://stackoverflow.com/users/2834466/antonbass – tsando

Verwandte Themen