У меня есть база данных со столбцом даты в следующем формате:
Однако мне нужно работать с этой базой данных, чтобы ее можно было распознать как временной ряд. В этом случае названия «неделя 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, а затем получить еженедельную частоту рабочих дней?
Это возможно, конечно, но какова первоначальная дата? Не могли бы вы объяснить немного больше?
Я вижу, вы отметили это с помощью [dataframe ], но не упомянули никаких подробностей. Вы используете Панды? Вы читали руководство пользователя, связанное с этим? Функциональность временных рядов/дат . Я думаю, что § Объекты DateOffset наиболее актуальны.
Нужно ли учитывать праздники?
@MarkRansom Если проще обойтись без праздников, я могу их игнорировать.
@LukeL Дата начала — январь 2022 года, а дата окончания — июнь 2024 года. Как показано на фотографии, с базой все в порядке. jun 24 представляет информацию с детализацией по месяцам, а недели ниже соответствуют тому же месяцу, но с детализацией по неделям. Я хотел бы прочитать эти недели как даты






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).