2015-07-23 12 views
5

Muszę dodać dni robocze do dat wymienionych w istniejącej kolumnie w ramce danych. Dane w kolumnie są typu datetime64 [ns]. Korzystając z sugestii od Business days in Python, spróbowałem kodu wymienionego poniżej.Dodawanie dni roboczych do kolumny datetime

import datetime 
from pandas.tseries.offsets import BDay 

df['Math Admin Date'] + BDay(1) 

mam następujący komunikat o błędzie:

TypeError: cannot use a non-absolute DateOffset in datetime/timedelta operations [<BusinessDay>] 

Jak mogę dodać dni roboczych do mojego kolumny datetime?

+0

Musimy zobaczyć, skąd pochodzi 'df ['Math Admin Date']. –

Odpowiedz

4

Niestety offsety nie obsługują operacji przy użyciu tablicę obiektów jak więc trzeba apply offsetu dla każdego elementu:

In [208]: 
import datetime as dt 
from pandas.tseries.offsets import BDay 
​ 
df = pd.DataFrame({'Math Admin Date':pd.date_range(start=dt.datetime(2015,6,1), end = dt.datetime(2015,6,30))}) 
df['Math Admin Date'].apply(lambda x: x + BDay(1)) 

Out[208]: 
0 2015-06-02 
1 2015-06-03 
2 2015-06-04 
3 2015-06-05 
4 2015-06-08 
5 2015-06-08 
6 2015-06-08 
7 2015-06-09 
8 2015-06-10 
9 2015-06-11 
10 2015-06-12 
11 2015-06-15 
12 2015-06-15 
13 2015-06-15 
14 2015-06-16 
15 2015-06-17 
16 2015-06-18 
17 2015-06-19 
18 2015-06-22 
19 2015-06-22 
20 2015-06-22 
21 2015-06-23 
22 2015-06-24 
23 2015-06-25 
24 2015-06-26 
25 2015-06-29 
26 2015-06-29 
27 2015-06-29 
28 2015-06-30 
29 2015-07-01 
Name: Math Admin Date, dtype: datetime64[ns] 

Korzystanie z Timedelta będzie działać, ale to nie obsługuje dni roboczych w tej chwili:

df['Math Admin Date'] + pd.Timedelta(1,'D') 
+0

Dziękuję za sugestię! Działa to, ale mam zamiar dodać różne liczby dni roboczych do różnych kolumn i zastanawiam się, czy możliwe jest uczynienie tej funkcji wieloma argumentami zamiast ciągłego korzystania z funkcji anonimowej. Na przykład def add_busdays (df.column, liczba dni roboczych do dodania). – BGreen

+0

Tak, po prostu zmieniłoby się na 'def func (x, num_days = 1): x + BDay (num_days)', a następnie wywołaj to w kolumnie: 'df ['column']. Apply (lambda x: func (x , some_num)) ' – EdChum