Skip to content Skip to sidebar Skip to footer

Pandas Offset Datetimeindex To Next Business If Date Is Not A Business Day

I have a DataFrame which is indexed with the last day of the month. Sometimes this date is a weekday and sometimes it is a weekend. Ignoring holidays, I'm looking to offset the dat

Solution 1:

You can add 0*BDay()

from pandas.tseries.offsets import BDay
df.index = df.index.map(lambda x : x + 0*BDay())

You can also use this with a Holiday calendar with CDay(calendar) in case there are holidays.

Solution 2:

You can map the index with a lambda function, and set the result back to the index.

df.index=df.index.map(lambdax:xifx.dayofweek<5elsex+pd.DateOffset(7-x.dayofweek))dfA2015-04-30  02015-06-01  02015-06-30  0

Solution 3:

Using DataFrame.resample

A more idiomatic method would be to resample to business days:

df.resample('B', label='right', closed='right').first().dropna() 

              A
2015-04-300.02015-06-01  0.02015-06-300.0

Solution 4:

Can also use a variation of the logic: a)given input date = 'inputdate', go back one business day using pandas date_range which has business days input; then b) go forward one business day using the same. To do this, you generate a vector with 2 inputs using data_range and select the min or max value to return the appropriate single value. So this could look as follows:

a) get business day before:

date_1b_bef = min(pd.date_range(start=inputdate, periods = 2, freq='-1B'))

b) get business day after the 'business day before':

date_1b_aft = max(pd.date_range(start=date_1b_bef, periods = 2, freq='1B'))

or substituting a) into b) to get one line:

date_1b_aft = max(pd.date_range(start=min(pd.date_range(start=inputdate, periods = 2, freq='-1B')), periods = 2, freq='1B'))

This can also be used with relativedelta to get the business day after some calendar period offset from inputdate. For example:

a) get the business day (using 'following' convention if offset day is not a business day) for 1 calendar month prior to 'input date':

date_1mbef_fol = max(pd.date_range(min(pd.date_range(start=inputdate + relativedelta(months=-1), periods = 2, freq='-1B')), periods = 2, freq = '1B'))

b) get the business day (using 'preceding' convention if offset day is not a business day) for 1 year prior to 'input date':

date_1ybef_pre = min(pd.date_range(max(pd.date_range(start=inputdate + relativedelta(years=-1), periods = 2, freq='1B')), periods = 2, freq = '-1B'))

Post a Comment for "Pandas Offset Datetimeindex To Next Business If Date Is Not A Business Day"