Не очень быстрое решение (поскольку оно включает 2 вложенных цикла), но я надеюсь, что это решит ваш вопрос
import pandas as pd
import datetime
import calendar
pd.set_option('display.max_rows', 100)
cols = ['day', 'month', 'year']
data = [
['1st Monday', 8, 2015],
['3rd Tuesday', 12, 2017],
['4th Wednesday', 5, 2019]
]
df = pd.DataFrame(data=data, columns=cols)
df['week_number'] = df['day'].str.slice(0, 1)
df['week_number'] = df['week_number'].astype('int')
df['day_name'] = df['day'].str.slice(4)
def generate_dates(input_df, index_num):
_, days = calendar.monthrange(input_df.loc[index_num, 'year'], input_df.loc[index_num, 'month'])
df_dates = pd.DataFrame()
for i in range(1, days + 1):
df_dates.loc[i - 1, 'date'] = datetime.date(input_df.loc[index_num, 'year'], input_df.loc[index_num, 'month'],
i)
df_dates.loc[i - 1, 'year'] = input_df.loc[index_num, 'year']
df_dates.loc[i - 1, 'days'] = calendar.weekday(input_df.loc[index_num, 'year'],
input_df.loc[index_num, 'month'], i)
df_dates.loc[i - 1, 'day_name'] = df_dates.loc[i - 1, 'date'].strftime("%A")
df_dates['week_number'] = 1
df_dates['week_number'] = df_dates.groupby('day_name')['week_number'].cumsum()
return df_dates
dates = pd.DataFrame(columns=['date', 'year', 'days', 'day_name', 'week_number'])
for row in df.index:
dates = pd.concat([dates, generate_dates(df, row)])
df2 = df.merge(dates, on=['year', 'day_name', 'week_number'])
print(df2)