Python Найти день дат между диапазоном двух дат - PullRequest
4 голосов
/ 22 июня 2019

Я работаю над проектом, использующим python3, в котором мне нужно использовать API и мне нужно получить данные за определенный день недели в диапазоне от даты.

Итак, пример входных параметров:

firstDay = '1-January-2000'
lastDay = '22-february-2000'
weekDay = 'Monday'

Таким образом, дата будет включена в ответ API, но ничего не имеет информации за день. Итак, мне нужно получить все даты за определенный день, например Monday в диапазоне дат.

В соответствии с приведенным выше примером, как я могу получить даты для всех Mondays между firstDay и lastDay?

Ответы [ 3 ]

5 голосов
/ 22 июня 2019
from datetime import date, timedelta, datetime
import time

firstDay = '1-January-2000'
lastDay = '22-february-2000'
weekDay = 'Monday'

firstDay = datetime.strptime(firstDay, '%d-%B-%Y') 
lastDay = datetime.strptime(lastDay, '%d-%B-%Y')
dates = [firstDay + timedelta(days=x) for x in range((lastDay-firstDay).days + 1) if (firstDay + timedelta(days=x)).weekday() == time.strptime(weekDay, '%A').tm_wday]

вывод

dates
[datetime.datetime(2000, 1, 3, 0, 0),
 datetime.datetime(2000, 1, 10, 0, 0),
 datetime.datetime(2000, 1, 17, 0, 0),
 datetime.datetime(2000, 1, 24, 0, 0),
 datetime.datetime(2000, 1, 31, 0, 0),
 datetime.datetime(2000, 2, 7, 0, 0),
 datetime.datetime(2000, 2, 14, 0, 0),
 datetime.datetime(2000, 2, 21, 0, 0)]


вывод в формате weekDay-Month-year

[d.strftime("%A-%B-%Y") for d in dates] 

['Monday-January-2000',
 'Monday-January-2000',
 'Monday-January-2000',
 'Monday-January-2000',
 'Monday-January-2000',
 'Monday-February-2000',
 'Monday-February-2000',
 'Monday-February-2000']

вывод в формате firstDay: 1-January-2000

[d.strftime("%-d-%B-%Y") for d in dates]   
['3-January-2000',
 '10-January-2000',
 '17-January-2000',
 '24-January-2000',
 '31-January-2000',
 '7-February-2000',
 '14-February-2000',
 '21-February-2000']
1 голос
/ 22 июня 2019

пожалуйста, попробуйте это:

import datetime
import calendar

def get_all_weekdays_between_range(firstDay, lastDay, weekDay):
    month_name_to_num = {v.lower(): k for k, v in enumerate(calendar.month_name)}
    day_name_to_num = {v.lower(): k for k, v in enumerate(calendar.day_name)}

    def parse_date(dateStr):
        parts = dateStr.split('-')
        return datetime.date(int(parts[2]), month_name_to_num[parts[1].lower()], int(parts[0]))

    first = parse_date(firstDay)
    last = parse_date(lastDay)

    result = []
    current = first
    while current <= last:
        if calendar.weekday(current.year, current.month, current.day) == day_name_to_num[weekDay.lower()]:
            result.append(current)
        current += datetime.timedelta(days=1)
    return result


firstDay = '1-January-2000'
lastDay = '22-february-2000'
weekDay = 'Monday'

all_days = get_all_weekdays_between_range(firstDay,lastDay,weekDay)
for day in all_days:
    print(day)
0 голосов
/ 22 июня 2019

Вы пытались использовать библиотеку datetime в python, это идеальный сценарий для этого. Он содержит всю информацию о годах, месяцах и днях и может даже делать вычисления дат. Например, нахождение количества дней между двумя датами. Он также может конвертировать даты в любой формат, который вы хотите.

https://docs.python.org/3/library/datetime.html

Вот ответ на ваш вопрос

from datetime import date, timedelta
dstart = datetime.strptime('1-January-2000', '%d-%B-%Y') 
dend= datetime.strptime('22-February-2000', '%d-%B-%Y')
ans = (dend - dstart).days / 7
if int(ans) + 2/7 <= ans:
    ans = int(ans) + 1
else:
    ans = int(ans)
print(ans)
...