2013-07-17 18 views
13

Có cách nào tốt hơn bdate_range() để đo lường ngày làm việc giữa hai cột ngày qua gấu trúc không?Đếm ngày làm việc giữa hai chuỗi

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 

Với sản lượng:

  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 

Cảm ơn!

+0

Có thể trùng lặp: http://stackoverflow.com/questions/13019719/get-business-days-between-start-and-end-date-using-pandas (Xem phần dưới để đếm ngày, thay vì liệt kê chúng.) –

+0

@DanAllan có cảm giác như đang làm điều tương tự, theo nghĩa là bạn đang tạo một phạm vi ngày trung gian ... tuy nhiên nó có thể không bị chiếm hữu ble mà không làm điều đó. : s –

+0

Có, chắc chắn. Nếu bạn đang nghiên cứu các phạm vi dài và bạn chỉ cần loại trừ các ngày cuối tuần (nhưng không phải ngày lễ), tôi hy vọng sẽ nhanh hơn khi xây dựng hàm tùy chỉnh sử dụng các ngày trong tuần cho A và B và tổng số khác biệt của chúng trong thời gian tính toán số ngày làm việc. –

Trả lời

11

brian_the_bungler là vào cách hiệu quả nhất để làm busday_count này sử dụng NumPy của:

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 

Trên máy tính của tôi đây là 300x nhanh hơn trên trường hợp thử nghiệm của bạn, và 1000s lần nhanh hơn trên mảng lớn hơn nhiều ngày

+1

Cú pháp thay thế và ngắn gọn hơn cho [Antonbass] [1] là: '' 'df ['DIFF'] = np.busday_count (df ['A']. Tolist(), df ['B'] ToList()) '' ' hoặc ' '' df [ 'DIFF'] = np.busday_count (df.index.date.tolist(), df [ 'B'] ToList.()) '' ' nếu sử dụng chỉ mục làm cột ngày. [1]: https://stackoverflow.com/users/2834466/antonbass – tsando