如何解决Python Pandas Datetime在每个月的N个工作日之前过滤行
我想过滤我的数据框,使其仅包含每个月的第一个和第四个工作日(包括第一个和第四个工作日以及之间的可能的周末/国家假日)之间的结果。月份或年份无所谓。只要在第N个工作日之前,同一日期就可以多次出现。
date score1
0 1.7.2020 10
1 2.7.2020 15
2 2.7.2020 16
3 3.7.2020 8
4 4.7.2020 2
5 5.7.2020 6
6 2.8.2020 9
7 3.8.2020 5
8 3.8.2020 1
9 4.8.2020 3
10 8.8.2020 0
结果应为:
date score1
0 1.7.2020 10
1 2.7.2020 15
2 2.7.2020 16
3 3.7.2020 8
4 4.7.2020 2
5 5.7.2020 6
7 3.8.2020 5
8 3.8.2020 1
9 4.8.2020 3
解决方法
加载模块:
import pandas as pd
import numpy as np
import io
import datetime
读取数据:
df = pd.read_csv(io.StringIO("""
date score1
0 1.7.2020 10
1 2.7.2020 15
2 2.7.2020 16
3 3.7.2020 8
4 4.7.2020 2
5 5.7.2020 6
6 2.8.2020 9
7 3.8.2020 5
8 3.8.2020 1
9 4.8.2020 3
10 8.8.2020 0
"""),sep="\s\s+",engine="python")
日期格式:
df['date'] = pd.to_datetime(df['date'],format='%d.%m.%Y')
df['weekday'] = df['date'].apply(lambda x: x.weekday())
df['day_of_week'] = df['date'].dt.day_name()
df['month'] = pd.DatetimeIndex(df['date']).month
df['day_of_month'] = pd.DatetimeIndex(df['date']).day
仅选择每月的前4个工作日。由于这可能(在某些月份中)包括2天的周末,因此每个月最少计算4天,最多计算6天。例如,如果8月1日是星期六,8月2日是星期日,四个工作日是8月3日(星期一),8月4日(星期二),8月5日(星期三)和8月6日(星期四),则需要考虑day_of_month
中6天。
ndf = df[(df['day_of_month'] > 0) & (df['day_of_month'] <= 6)].reset_index(drop=False)
列day_of_week
是多余的,但是我添加了该列以显示星期一是工作日= 0,星期二是工作日= 1,依此类推。现在,我们知道如何选择工作日(我假设星期六和星期日都不是)工作日;-)
ndf = ndf[(ndf['weekday'] >= 0) & (ndf['weekday'] < 5)]
仅应显示每月的前4个工作日。
这很棘手,因为一个工作日可以出现在多行中。
对于前。 2.7.2020出现了两次。因此,要包括4个工作日,应使用随每个新工作日而上升的索引来计算唯一工作日的数量。这是在以下操作中完成的,其中ind1
是仅在每个新的工作日才计数的索引:
ndf['ind1'] = list(ndf.groupby('week')['day_of_week'].transform(lambda x: pd.factorize(x)[0]))
使用ind1
,我们可以选择0、1、2或3的行,并按月份对值进行排序:
ndf[(ndf['ind1'] >= 0) & (ndf['ind1'] < 4)].sort_values(by='month',ascending=True)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。