numpy Pandas:寻找每月第一个星期一之后的第一个星期五

kqlmhetl  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(167)

目前正在尝试使用这样的代码来解决这个问题..但还不能完全理解:

df[(df.index.day_of_week==0) & (df.index.day<15) & (df.shift(-4).index.day_of_week==4)]

这就是数据的样子。(为方便起见,我添加了星期几列)。基本上,我尝试找出该月的第一天=0(星期一),然后筛选出之后的第一天=4(星期五)

close  day_of_week
date                                
2022-07-01  3825.330078            4
2022-07-05  3831.389893            1
2022-07-06  3845.080078            2
2022-07-07  3902.620117            3
2022-07-08  3899.379883            4
2022-07-11  3854.429932            0
2022-07-12  3818.800049            1
2022-07-13  3801.780029            2
2022-07-14  3790.379883            3
2022-07-15  3863.159912            4
...
2022-08-01  4118.629883            0
2022-08-02  4091.189941            1
2022-08-03  4155.169922            2
2022-08-04  4151.939941            3
2022-08-05  4145.189941            4
2022-08-08  4140.060059            0
2022-08-09  4122.470215            1
2022-08-10  4210.240234            2
2022-08-11  4207.270020            3
2022-08-12  4280.149902            4
...
2022-09-01  3966.850098            3
2022-09-02  3924.260010            4
2022-09-06  3908.189941            1
2022-09-07  3979.870117            2
2022-09-08  4006.179932            3
2022-09-09  4067.360107            4
2022-09-12  4110.410156            0
2022-09-13  3932.689941            1
2022-09-14  3946.010010            2
2022-09-15  3901.350098            3
2022-09-16  3873.330078            4
...
2022-10-03  3678.429932            0
2022-10-04  3790.929932            1
2022-10-05  3783.280029            2
2022-10-06  3744.520020            3
2022-10-07  3639.659912            4
2022-10-10  3612.389893            0
2022-10-11  3588.840088            1
2022-10-12  3577.030029            2
...
2022-11-01  3856.100098            1
2022-11-02  3759.689941            2
2022-11-03  3719.889893            3
2022-11-04  3770.550049            4
2022-11-07  3806.800049            0
2022-11-08  3828.110107            1

这应该返回:

2022-07-15  3863.159912            4
2022-08-05  4145.189941            4
2022-09-16  3873.330078            4
2022-10-07  3639.659912            4

编辑:虽然我不认为这会起作用,但我好奇为什么这不会返回任何结果?以这种方式过滤时是否不支持移位

df[(df.index.day_of_week==0) & (df.index.day<15) & (df.shift(-4).index.day_of_week==4)]
ut6juiuv

ut6juiuv1#

您可以按[year, month, day_of_week]进行分组,然后执行cumcount将其day_of_week在本月出现的次数分配给每一行。
然后,使用筛选器day_of_week == 0 & cumcount == 0获取与该月的第一个星期一相对应的行,并将它们的索引移位4天,以获得随后的星期五。最后,我们进行交集以过滤掉原始框架中不存在的移位索引。

wanted_indices = df.index[df.groupby([df.index.year, df.index.month, df['dow']]).cumcount().eq(0) & df['dow'].eq(0)].shift(4, 'D')
df.loc[wanted_indices.intersection(df.index)]

对您的示例 Dataframe 的结果

close       dow
date        
2022-07-15  3863.159912 4
2022-08-05  4145.189941 4
2022-09-16  3873.330078 4
2022-10-07  3639.659912 4
t98cgbkg

t98cgbkg2#

我觉得最简单的方法就是认识到每个月第一个星期一之后的星期五必须不少于第五天*(星期一必须至少是第一天)*。因此,只需先按需求进行筛选,然后再按day_of_week进行筛选。

df_filtered = df[df.index.dt.day >= 5]
first_fridays = df[df['day_of_week'] == 5]

相关问题