Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonDataFrame:根据月份获取可选天数?_Python_Pandas_Numpy_Dataframe_Datetime - Fatal编程技术网

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