Omeed Totakhel
Omeed Totakhel

Reputation: 487

How to find number of Fridays/Thursdays in date range

Is there any python function to deduce the number of Fridays or Thursdays from a date range? I searched google and I found many methods which usually use days divided by 7 concept but it does not give you the accurate days. For example from 1/Nov/2016 to 12/Nov/2016 there are two Fridays and two Thursdays so the result of subtraction should be 8.

Upvotes: 1

Views: 2176

Answers (4)

Samuel
Samuel

Reputation: 61

You can do it with numpy:

import numpy as np
from datetime import datetime

start_date = datetime(2022, 10, 19).strftime('%Y-%m-%d')
end_date = datetime(2022, 12, 21).strftime('%Y-%m-%d')

weekend_days = np.busday_count(start_date, end_date, weekmask='0000110').item()

numpy busday_count doc

Keep in mind that end date is excluded from the count.

Upvotes: 1

Omeed Totakhel
Omeed Totakhel

Reputation: 487

i figure out a method, correct me if i am wrong.

here is my code

from datetime import date, timedelta, datetime

curr = "1-11-2016"
end = "30-11-2016"
format = "%d-%m-%Y"
start_date = datetime.strptime(curr, format)
end_date = datetime.strptime(end, format)

step = timedelta(1)
num_thur_fri = 0
off_days = ['Fri','Thu']

days = (end_date - start_date).days
for x in range(days):
    day = start_date.strftime("%a")
    print(day)
    if day in off_days:
        num_thur_fri += 1
    start_date += step

print(num_thur_fri)

Upvotes: 0

brianpck
brianpck

Reputation: 8254

Here is a simpler and faster approach that will calculate this figure for long periods of time.

First, you must calculate the amount of days between two datetime's. You can then floor divide by 7 to get the amount of entire weeks and multiply by 2 to get the number of Thursdays and Fridays. The final step is to modulo by seven to get the amount of days at the tail and then calculate how many of those are Thursdays or Fridays: this last step is the only one that actually requires knowing which weekday it is.

A full function would be:

from datetime import datetime, timedelta

def thursday_fridays_between(date1, date2):
    days_between = abs((date2 - date1).days)
    thursday_friday = days_between // 7 * 2
    thursday_friday += sum((a + timedelta(i)).weekday() in (3, 2) for i in range(days_between % 7 + 1))
    return thursday_friday

It can be used as follows:

>>> a = datetime(2016, 11, 1)
>>> b = datetime(2016, 11, 12)
>>> thursday_fridays_between(a, b)
4

Upvotes: 0

Patrick Haugh
Patrick Haugh

Reputation: 60994

Using the date object from the datetime module.

from datetime import date, timedelta

curr = date(2016, 11, 1)
end = date(2016, 11, 12)
step = timedelta(1)
num_thur_fri = 0
while curr <= end:
    if curr.weekday() in [3,2]: #Friday and thursday
        num_thur_fri += 1
    curr += step
print(num_thur_fri)

More reading here: https://docs.python.org/2/library/datetime.html#module-datetime

@brianpck is right, this is a really naive solution. Here's a better one

from datetime import date

begin = date(2016, 11, 1)
end = date(2016, 11, 12)
diff = (begin-end).days
day_of_week = begin.weekday()
num_thur_fri = 2*(diff//7)
for i in range(diff%7):
    if day_of_week in [2,3]:
        num_thur_fri += 1
    day_of_week = (day_of_week +1) %7

Upvotes: 0

Related Questions