How can I get all days between two days?

I need all weekdays for two days.

Example:

Wednesday - Friday = Wednesday, Thursday, Friday  
        3 - 5 = 3, 4, 5

 Saturday - Tuesday = Saturday, Sunday, Monday, Tuesday
        6 - 2 = 6, 7, 1, 2

I am sure there is a smart algorithm to solve this problem. The only algorithms I can come up with use either a loop or an operator if.

There must be an elegant way to solve this problem. I use numbers 1-7 for weekdays, but 0-6 is good too.

The best I could come up with:

def between(d1, d2):
     alldays = [0,1,2,3,4,5,6,0,1,2,3,4,5,6]    # or range(7) * 2
     offset = 8 if d1 > d2 else 1
     return alldays[d1:d2 + offset]

between(0, 4)
# [0,1,2,3,4]

between(5,2)
# [5,6,0,1,2]
+3
source share
7 answers
>>> def weekdays_between(s, e):
...     return [n % 7 for n in range(s, e + (1 if e > s else 8))]
... 
>>> weekdays_between(2, 4)
[2, 3, 4]
>>> weekdays_between(5, 1)
[5, 6, 0, 1]

This is a little trickier if you need to convert from / to actual days.

>>> days = 'Mon Tue Wed Thu Fri Sat Sun'.split()
>>> days_1 = {d: n for n, d in enumerate(days)}
>>> def weekdays_between(s, e): 
...     s, e = days_1[s], days_1[e]
...     return [days[n % 7] for n in range(s, e + (1 if e > s else 8))]
... 
>>> weekdays_between('Wed', 'Fri')
['Wed', 'Thu', 'Fri']
>>> weekdays_between('Sat', 'Tue')
['Sat', 'Sun', 'Mon', 'Tue']
+8

( ):

weekday[] = {"Mon" .. "Sun"}
for(i = wkday_start; (i % 7) != wkday_end; i = (i+1) % 7)
    printf("%s ", weekday[i]);

, wkday_start - , ( 0), wkday_end - .

,

.

+9

Stephan202, .

>>> def circular_slice(r, s, e):
... return [r[n % len(r)] for n in range(s, e + (1 if e>s else len(r)+1))]
...
>>> circular_slice(range(0,7), 2, 4)
[2, 3, 4]
>>> circular_slice(range(0,7), 5, 1)
[5, 6, 0, 1]
>>> circular_slice('Mon Tue Wed Thu Fri Sat Sun'.split(), 5, 1)
['Sat', 'Sun', 'Mon', 'Tue']
+2

, - . , , , , ?

>>> from datetime import timedelta, date
>>> from dateutil.rrule import rrule, DAILY
>>> today = date(2009, 10, 13) # A tuesday
>>> week = today - timedelta(days=6)
>>> list(rrule(DAILY, byweekday=xrange(5), dtstart=week, until=today))
[datetime.datetime(2009, 10, 7, 0, 0),
 datetime.datetime(2009, 10, 8, 0, 0),
 datetime.datetime(2009, 10, 9, 0, 0),
 datetime.datetime(2009, 10, 12, 0, 0),
 datetime.datetime(2009, 10, 13, 0, 0)]

python-dateutil .

+1

:

import calendar

def intervening_days(day1, day2):
    weektest = list(calendar.day_name)*2
    d1 = weektest.index(day1)
    d2 = weektest.index(day2,d1+1)
    return weektest[d1:d2+1]

print intervening_days("Monday","Sunday")
print intervening_days("Monday","Tuesday")
print intervening_days("Thursday","Tuesday")
print intervening_days("Monday","Monday")

['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
['Monday', 'Tuesday']
['Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday']

, , d2 d2 = weektest.index(day2,d1).

+1

, , ; # LINQ:

DayOfWeek start = DayOfWeek.Wednesday;
DayOfWeek end = DayOfWeek.Friday;

IEnumerable<DayOfWeek> interval = 
    Enum.GetValues(typeof(DayOfWeek)).OfType<DayOfWeek>()
        .Where(d => d >= start && d <= end);

Console.WriteLine(
    String.Join(", ", 
        interval.Select(d => d.ToString()).ToArray()));

Perhaps, using any language, you should assign values ​​to each day ( Sunday=0etc.) and look for all the values ​​that match your desired interval.

0
source

The following code returns 1 for Monday - Monday.

bool isWeekday(int d) {
    return d >= 1 && d <= 5;
}

int f(int d1, int d2) {
    int res = isWeekday(d1) ? 1 : 0;
    return d1 == d2 ?
           res :
           res + f(d1 % 7 + 1, d2);
}
0
source

Source: https://habr.com/ru/post/1720273/


All Articles