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 == 1
returns正常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
从来没有真正受到影响,因为它是 3 到 5 所有提到的天数范围.
所以,当我这样编码时:
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
过滤表达式中正确地使用括号来分隔 A
和 B
语句,一切都会按设计进行!
谢谢大家的宝贵时间! =)
我有 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 == 1
returns正常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
从来没有真正受到影响,因为它是 3 到 5 所有提到的天数范围.
所以,当我这样编码时:
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
过滤表达式中正确地使用括号来分隔 A
和 B
语句,一切都会按设计进行!
谢谢大家的宝贵时间! =)