Как установить дату начала рабочей недели на месяц с помощью Python?

У меня есть база данных со столбцом даты в следующем формате:

Однако мне нужно работать с этой базой данных, чтобы ее можно было распознать как временной ряд. В этом случае названия «неделя 1», «неделя 2», «неделя 3» и «неделя 4» следует заменить датами. Если мы знаем, что каждая неделя состоит из 7 дней, каждая из недель месяца начнется в первый рабочий день этого месяца, а следующая неделя будет на 7 дней позже. Можно ли сделать это с помощью Python?

Например, в июне 2024 года первым рабочим днем ​​было 3-е число. Так,

week 1 = 06/03/2024
week 2 = 06/10/2024
week 3 = 06/17/2024
week 4 = 06/24/2024

И так далее, каждый месяц будет иметь свою специфику и дату начала. Можно ли сделать это с помощью Python, а затем получить еженедельную частоту рабочих дней?

Это возможно, конечно, но какова первоначальная дата? Не могли бы вы объяснить немного больше?

Luke L 05.08.2024 23:57

Нужно ли учитывать праздники?

Mark Ransom 06.08.2024 00:13

@MarkRansom Если проще обойтись без праздников, я могу их игнорировать.

User8563 06.08.2024 02:36

@LukeL Дата начала — январь 2022 года, а дата окончания — июнь 2024 года. Как показано на фотографии, с базой все в порядке. jun 24 представляет информацию с детализацией по месяцам, а недели ниже соответствуют тому же месяцу, но с детализацией по неделям. Я хотел бы прочитать эти недели как даты

User8563 06.08.2024 02:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Python datetime предоставляет числовой день недели, поэтому вам просто нужно добавить недостающие дни к следующему понедельнику (если первый день приходится на выходные):

import datetime as dt

def first_business_day(year, month):
    # Start with the first day of the month and it's weekday (0=Monday, 6=Sunday)
    first_day = dt.datetime(year, month, 1)
    first_weekday = first_day.weekday()

    for i, weekday in enumerate([5,6]): # Add days to next monday for sat/sun
        if first_weekday == weekday:
            first_day += dt.timedelta(days=2-i)
    # returns 4 weeks based on the first business day!
    return list(first_day + dt.timedelta(days=x*7) for x in range(0, 4))

for m in range(1, 13):
    first_business_day_weeks = first_business_day(2024, m)
    print("first_business_day_weeks:", [x.strftime("%Y-%m-%d") for x in first_business_day_weeks])

Вне:

first_business_day_weeks: ['2024-01-01', '2024-01-08', '2024-01-15', '2024-01-22']
first_business_day_weeks: ['2024-02-01', '2024-02-08', '2024-02-15', '2024-02-22']
first_business_day_weeks: ['2024-03-01', '2024-03-08', '2024-03-15', '2024-03-22']
first_business_day_weeks: ['2024-04-01', '2024-04-08', '2024-04-15', '2024-04-22']
first_business_day_weeks: ['2024-05-01', '2024-05-08', '2024-05-15', '2024-05-22']
first_business_day_weeks: ['2024-06-03', '2024-06-10', '2024-06-17', '2024-06-24']
first_business_day_weeks: ['2024-07-01', '2024-07-08', '2024-07-15', '2024-07-22']
first_business_day_weeks: ['2024-08-01', '2024-08-08', '2024-08-15', '2024-08-22']
first_business_day_weeks: ['2024-09-02', '2024-09-09', '2024-09-16', '2024-09-23']
first_business_day_weeks: ['2024-10-01', '2024-10-08', '2024-10-15', '2024-10-22']
first_business_day_weeks: ['2024-11-01', '2024-11-08', '2024-11-15', '2024-11-22']
first_business_day_weeks: ['2024-12-02', '2024-12-09', '2024-12-16', '2024-12-23']

Примечание. Если вам нужно решение для панд, взгляните на: Первая рабочая дата месяца Python

Игнорирование праздников:

import datetime
months = {'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, 'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12}
def first_weekday(month, year):
    if year < 100:
        year += 2000
    dt = datetime.datetime(year, month, 1)
    weekday = dt.weekday() # 0=monday, 6=sunday
    offset = 0 if weekday < 5 else 7 - weekday
    return dt + datetime.timedelta(days=offset)

date_str = 'jun/24'
month_str,year_str = date_str.split('/')
first_weekday(months[month_str], int(year_str))
# datetime.datetime(2024, 6, 3, 0, 0)

Это даст вам первый будний день любого месяца. Тогда для остального можно просто добавить datetime.timedelta(weeks=week-1).

Другие вопросы по теме

Как выполнить горячее кодирование столбца, который существует в нескольких кадрах данных pandas?
Новый столбец в фрейме данных Pandas с использованием метода наименьших квадратов из scipy.optimize
В кадре данных pandas для данного столбца: как умножить значение в той же строке df на другое значение в предыдущей строке собственного столбца?
Как я могу получить группу с наибольшей полосой отрицательных чисел в столбце и добавить еще одно условие для фильтрации групп?
Как лучше всего вернуть группу с наибольшей полосой отрицательных чисел в столбце?
Перемещение значений в pandas df в новый столбец в df, переименуйте столбец на основе строки в столбце
Перегруппировать элементы в фрейме данных на основе информации о паре
Переименование столбцов в R 4.3 с использованием собственного канала
Добавление двух фреймов данных pandas вместе — отдельные столбцы
Каков более быстрый способ использования Pandas для создания .loc в большом кадре данных?