Pandas:过滤后的 属性 表现得像未过滤的

Pandas: Filtered property behaves like unfiltered

我有 DT,这是一个 datetime64 系列:

0       2019-12-12 18:43:00
1       2019-03-22 18:30:00
2                       NaT
3       2019-04-17 02:00:00
4       2009-03-15 18:00:00
5       2019-04-02 20:25:00
6       2019-05-01 11:00:00
7       2019-04-10 17:00:00
8       1973-07-14 22:00:00
9       2019-06-06 19:00:00
10      2019-06-18 21:00:00
11      2019-06-12 22:00:00
12      2019-06-11 22:00:00
13      2018-06-15 01:00:00
14      1999-08-15 02:30:00
                ...        
88110   2019-10-01 22:00:00
88111   2019-10-01 22:45:00
88112   2019-10-02 01:00:00
88113   2019-10-02 03:26:00
88114   2019-10-02 03:26:00
88115   2019-10-02 05:33:00
88116   2019-10-02 06:35:00
88117   2019-10-02 12:00:00
88118   2019-10-02 19:00:00
88119   2019-10-02 19:15:00
88120   2019-10-02 20:00:00
88121   2019-10-02 20:00:00
88122   2019-10-02 20:03:00
88123   2019-10-02 22:00:00
88124   2019-10-02 22:00:00
Name: date_time, Length: 88125, dtype: datetime64[ns]

和一段代码:

DT[DT.between("2019-12-05", "2019-12-08") & DT.dt.weekday == 1].dt.weekday.value_counts()

产生:

5    27
3    23
4    19
Name: date_time, dtype: int64

其中包括 3、4 和 5 天,但没有请求的第 1 天!

所以,当我编码时:

DT[DT.between("2019-12-05", "2019-12-08")].dt.weekday

它产生:

3821     3
87138    3
87139    3
87140    3
87141    3
        ..
87328    5
87329    5
87330    5
87331    5
87332    5

这是合乎逻辑的,因为我们有 3 天的间隔,对应于 3 个工作日。是的,我们的日期范围内根本没有第 1 周!那么为什么这个 & DT.dt.weekday == 1 过滤器不起作用?

非常感谢您的宝贵时间!

更新

当我尝试使用 & DT.dt.weekday == 2& DT.dt.weekday == 3 等任何其他过滤器时,我得到一个空的 Series 作为过滤结果这个:

DT[DT.between("2019-12-05", "2019-12-08") & DT.dt.weekday == 4]

此外,DT.dt.weekday == 1returns正常True/False列表!

也许,我们不能按 dt.(...) 个参数过滤?

结果是:

DT[DT.between("2019-12-05", "2019-12-08") & DT.dt.weekday == 1]

是这样执行的:

DT[ (DT.between("2019-12-05", "2019-12-08") & DT.dt.weekday)   ==   1 ]

这就是为什么 DT.dt.weekday 过滤器在 2019-12-05 和 [=34] 之间的每一天返回 True =]-08 因为 & DT.dt.weekday 从来没有真正受到影响,因为它是 35 所有提到的天数范围.

所以,当我这样编码时:

DT[ (DT.between("2019-12-05", "2019-12-08")) & (DT.dt.weekday == 1) ]

一切都按预期进行,即没有选择任何东西。但是,另一方面:

DT[ (DT.between("2019-12-05", "2019-12-08")) & (DT.dt.weekday == 3) ]

产生了与第 3 天对应的几行。

因此,一旦在 A & B 过滤表达式中正确地使用括号来分隔 AB 语句,一切都会按设计进行!

谢谢大家的宝贵时间! =)