Я думаю, что наиболее простой и общий способ сделать это - создать справочную таблицу со всеми днями указанного года. И создайте дополнительные столбцы: month, day_name, day
.
Затем, чтобы проверить, какие day_names
находятся в df['salary_day
] `.
После этого мы проверяем, не четно ли day
, по: day % 2 > 0
.
Наконец, мы GroupBy.agg
и присоединяем day
как строку ,
:
# create salary days to get altnerative days
days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
df = pd.DataFrame({'salary_day': days})
START_MONTH = 5
YEAR = 2020
def create_dates(y, month_start):
dates = pd.date_range(f'{y}-{str(month_start).zfill(2)}-01', f'{y}-12-31')
dates = pd.DataFrame({'dates': dates})
dates['month'] = dates['dates'].dt.month
dates['day_name'] = dates['dates'].dt.day_name().str.lower()
dates['day'] = dates['dates'].dt.day
return dates
def get_alternative_dates(salary_days, y, month_start):
df_dates = create_dates(y, month_start)
m = df_dates['day_name'].isin(salary_days)
months = df_dates[m].copy()
months['day'] = months['day'].astype(str)
months['rank_days'] = months.groupby('day_name')['day'].cumcount().add(1)
months = months[months['rank_days'].mod(2).ne(0)]
df_final = months.groupby(['month', 'day_name'])['day'].agg(','.join).reset_index()
return df_final
get_alternative_dates(df['salary_day'], YEAR, START_MONTH)
Вывод
month day_name day
0 5 friday 1,15,29
1 5 thursday 7,21
2 6 friday 12,26
3 6 thursday 4,18
4 7 friday 10,24
5 7 thursday 2,16,30
6 8 friday 7,21
7 8 thursday 13,27
8 9 friday 4,18
9 9 thursday 10,24
10 10 friday 2,16,30
11 10 thursday 8,22
12 11 friday 13,27
13 11 thursday 5,19
14 12 friday 11,25
15 12 thursday 3,17,31