Reputation: 29
I am testing using Robot Framework and need to create my own Python keyword.
Taking the current date as day 0 (tomorrow as day 1), I am trying to calculate what the date will be 5 days from today. If any of the days in the next 5 days is a Saturday I need to add an extra day to my calculation. Same if any of the days is a Sunday.
As a Python beginner, I'm a little out of my depth so any help would be much appreciated
Upvotes: 2
Views: 1259
Reputation: 880299
Using NumPy, you can find add or subtract business days using np.busday_offset
:
Since 2016-03-27
is a Sunday, rolling forward returns the first valid business day, 2016-03-28
:
import numpy as np
np.busday_offset('2016-03-27', 0, roll='forward')
# numpy.datetime64('2016-03-28')
To obtain a datetime
object, call item()
:
np.busday_offset('2016-03-27', 0, roll='forward').item()
# datetime.date(2016, 3, 28)
To advance 5 business days, change the second argument to 5:
np.busday_offset('2016-03-27', 5, roll='forward').item()
# datetime.date(2016, 4, 4)
To go back 5 business days, use a negative offset and roll='backward':
np.busday_offset('2016-03-27', -5, roll='backward').item()
# datetime.date(2016, 3, 18)
np.busday_offset('2016-03-28', -5, roll='backward').item()
# datetime.date(2016, 3, 21)
Here's a calendar for reference:
March 2016 April 2016
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28 29 30
Upvotes: 1
Reputation: 213005
If you want to work with a lot of timeseries, have a look at pandas. Adding five business days is quite straightforward:
from datetime import datetime
import pandas as pd
today = datetime.today()
then = today + pd.tseries.offsets.BDay(5)
Upvotes: 1
Reputation: 180481
You can do it mathematically:
from datetime import timedelta
def business_days(date, days):
if days == 0:
return date
day = date.weekday()
if day in (5, 6):
date += timedelta(days=7 - day)
days -= 1
date += timedelta(days=days / 5 * 7)
return date + timedelta(days=days % 5)
It will work to get a date n
business days from or since whatever date you pass in:
In [6]: dte = datetime.datetime.today()
In [7]: business_days(dte, 5)
Out[7]: datetime.datetime(2016, 1, 6, 11, 28, 38, 264331)
In [8]: business_days(dte, -5)
Out[8]: datetime.datetime(2015, 12, 23, 11, 28, 38, 264331)
Upvotes: 1
Reputation: 814
Basically you need to add 5 business days... This should do it:
import datetime
def addBusinessDays(from_date, add_days):
business_days_to_add = add_days
current_date = from_date
while business_days_to_add > 0:
current_date += datetime.timedelta(days=1)
weekday = current_date.weekday()
if weekday >= 5: # sunday = 6
continue
business_days_to_add -= 1
return current_date
#demo:
print '5 business days from today:'
print addBusinessDays(datetime.date.today(), 5)
Update:
Here is the explanation:
Upvotes: 1