目前正在尝试使用这样的代码来解决这个问题..但还不能完全理解:
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)]
2条答案
按热度按时间ut6juiuv1#
您可以按
[year, month, day_of_week]
进行分组,然后执行cumcount
将其day_of_week
在本月出现的次数分配给每一行。然后,使用筛选器
day_of_week == 0 & cumcount == 0
获取与该月的第一个星期一相对应的行,并将它们的索引移位4天,以获得随后的星期五。最后,我们进行交集以过滤掉原始框架中不存在的移位索引。对您的示例 Dataframe 的结果
t98cgbkg2#
我觉得最简单的方法就是认识到每个月第一个星期一之后的星期五必须不少于第五天*(星期一必须至少是第一天)*。因此,只需先按需求进行筛选,然后再按
day_of_week
进行筛选。