2013-07-17 36 views
13

是否有比bdate_range()更好的方式來測量通過pandas的兩列日期之間的工作日?計算兩個系列之間的工作日

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 

隨着輸出:

  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 

謝謝!

+0

可能的重複:http://stackoverflow.com/questions/13019719/get-business-days-between-start-and-end-date-using-pandas(查看底部計算日期,而不是列出它們。 ) –

+0

@DanAllan它感覺就像是在做同樣的事情,因爲你正在創建一箇中間日期範圍......但它可能不是possi沒有這樣做。 :s –

+0

是的,絕對。如果您正在研究長距離,並且您只需要排除週末(而不是假期),則我預計構建一個自定義函數會更快,該函數使用A和B的一週中的幾天以及它們總計的時間差來計算工作日的數量。 –

回答

11

brian_the_bungler是在做這個使用numpy的的busday_count的最有效的方法:

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 

在我的機器,這是300X您的測試用例上更快,次1000日期

快上更大的陣列
+1

[Antonbass] [1]的另一個更簡潔的語法是: '''df ['DIFF'] = np.busday_count(df ['A']。tolist(),df ['B'] .tolist()) ''' 或 '''DF [ 'DIFF'] = np.busday_count(df.index.date.tolist(),DF [ 'B']。tolist()) ''' 如果使用索引作爲日期列。 [1]:https://stackoverflow.com/users/2834466/antonbass – tsando

相關問題