PythonDataFrame:根据月份获取可选天数?
我有一个带有PythonDataFrame:根据月份获取可选天数?,python,pandas,numpy,dataframe,datetime,Python,Pandas,Numpy,Dataframe,Datetime,我有一个带有salary\u day列的df salary_day 0 thursday 1 friday 我正试着为每一天安排不同的日期 对于2020年5月: 五月的星期四:7,14,21,28 ,五月的星期五:1,8,15,22,29 5月份的替代周四和周五的预期产量: df 对于2020年6月: 六月的星期四:4,11,18,25 六月的星期五:5,12,19,26 由于5月有5个星期五,6月的第一个星期五不是替代日,应排除
salary\u day列的df
salary_day
0 thursday
1 friday
我正试着为每一天安排不同的日期
对于2020年5月:
五月的星期四:7,14,21,28
,五月的星期五:1,8,15,22,29
5月份的替代周四和周五的预期产量
:
df
对于2020年6月:
六月的星期四:4,11,18,25
六月的星期五:5,12,19,26
由于5月有5个星期五,6月的第一个星期五不是替代日,应排除在外,并应考虑12,26
6月份的替代周四和周五的预期产量
:
df
编辑1:所有工作日
五月份
salary_day req_dates
0 Monday 4,18
1 Tuesday 5,19
2 Wednesday 6,20
3 Thursday 7,21
4 Friday 1,15,29
5 Saturday 2,16,30
6 Sunday 3,17,31
这对我很有用:
# for read_clipboard()
'''
salary_day
thursday
friday
'''
import pandas as pd
df = pd.read_clipboard()
print(df)
六月份:
year = 2020; month = 6
输出:
salary_day req_dates
0 thursday 07,21
1 friday 01,15,29
salary_day req_dates
0 thursday 04,18
1 friday 12,26
我认为最干净和通用的方法是创建一个包含指定年份所有日期的帮助表。并创建额外的列:
月、日、日
然后检查day\u名称
在df['salary\u day
]中
在此之后,我们通过:第%2天>0
检查天
是否不均匀
最后,我们GroupBy.agg
,并通过,
以字符串形式加入日
:
# 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
某个地方也必须指定年份。用当前年份更新“备用”日期的确切含义是什么?为什么6月12日星期五是6月26日星期五?看起来从第一次出现的星期四开始,工资必须每隔星期四和星期五处理一次。5月是个例外,因为5月1日星期五是一个月的1号。所以你也有一个起始月,所以它不是从1月1号开始的?这是一个你没有提供的重要细节。但是对于
6月
月。Friday
的Req输出是12,26
而不是05,19
。因为5月有5个星期五。同样修复了这一问题,请立即检查感谢Anshul,它适用于此用例。如果我想在一周中的所有日子都使用它,那么应该做哪些更改。所有日子都如中所示?你能澄清一下吗?你能分享样本输入和预期输出吗?谢谢,埃尔凡。如何在上述代码中包含一周中的所有天数请参见顶部的编辑,在列表中删除或添加您想要从中获取替代的天数天数
@花椒
year = 2020; month = 6
salary_day req_dates
0 thursday 04,18
1 friday 12,26
# 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