numpy 使用选定的月份(Pandas日期时间)筛选DataFrame中的所有行

hsgswve4  于 2022-12-18  发布在  其他
关注(0)|答案(2)|浏览(192)

我有以下一组日期,我希望过滤所有的行,如果它有'2022-02'在它。

Sunday      Monday      Tuesday     Wednesday   Thursday    Friday      Saturday
January     2021-12-26  2021-12-27  2021-12-28  2021-12-29  2021-12-30  2021-12-31  2022-01-01
January     2022-01-02  2022-01-03  2022-01-04  2022-01-05  2022-01-06  2022-01-07  2022-01-08
January     2022-01-09  2022-01-10  2022-01-11  2022-01-12  2022-01-13  2022-01-14  2022-01-15
January     2022-01-16  2022-01-17  2022-01-18  2022-01-19  2022-01-20  2022-01-21  2022-01-22
January     2022-01-23  2022-01-24  2022-01-25  2022-01-26  2022-01-27  2022-01-28  2022-01-29
February    2022-01-30  2022-01-31  2022-02-01  2022-02-02  2022-02-03  2022-02-04  2022-02-05
February    2022-02-06  2022-02-07  2022-02-08  2022-02-09  2022-02-10  2022-02-11  2022-02-12
February    2022-02-13  2022-02-14  2022-02-15  2022-02-16  2022-02-17  2022-02-18  2022-02-19
February    2022-02-20  2022-02-21  2022-02-22  2022-02-23  2022-02-24  2022-02-25  2022-02-26
March       2022-02-27  2022-02-28  2022-03-01  2022-03-02  2022-03-03  2022-03-04  2022-03-05
March       2022-03-06  2022-03-07  2022-03-08  2022-03-09  2022-03-10  2022-03-11  2022-03-12
March       2022-03-13  2022-03-14  2022-03-15  2022-03-16  2022-03-17  2022-03-18  2022-03-19
March       2022-03-20  2022-03-21  2022-03-22  2022-03-23  2022-03-24  2022-03-25  2022-03-26
April       2022-03-27  2022-03-28  2022-03-29  2022-03-30  2022-03-31  2022-04-01  2022-04-02
April       2022-04-03  2022-04-04  2022-04-05  2022-04-06  2022-04-07  2022-04-08  2022-04-09
....

我尝试过滤掉带有'2022- 02'的行,如下所示:PS此数据框有一行“March”,因为该行中也存在“2022-02”。

Sunday      Monday      Tuesday     Wednesday   Thursday    Friday      Saturday
February    2022-01-30  2022-01-31  2022-02-01  2022-02-02  2022-02-03  2022-02-04  2022-02-05
February    2022-02-06  2022-02-07  2022-02-08  2022-02-09  2022-02-10  2022-02-11  2022-02-12
February    2022-02-13  2022-02-14  2022-02-15  2022-02-16  2022-02-17  2022-02-18  2022-02-19
February    2022-02-20  2022-02-21  2022-02-22  2022-02-23  2022-02-24  2022-02-25  2022-02-26
March       2022-02-27  2022-02-28  2022-03-01  2022-03-02  2022-03-03  2022-03-04  2022-03-05

这些方法我都试过了,都不管用。
一个二个一个一个

vjhs03f7

vjhs03f71#

根据你的评论-
是的,它们是字符串
IIUC,这些日期是字符串,您试图在搜索字符串时将它们视为日期变量)。解决此问题的理想方法是将所有数据转换为datetime,然后使用pd.series.dt.方法,但是,由于所有数据都已经是字符串,这只是一个简单的字符串搜索问题,请随意使用以下方法。

  1. row.str.find('2022-02')>=0)检查在给定行中是否找到给定字符串。
  2. calender.apply(lambda row ...将其独立应用于每行。
  3. .any(1)在每行的True/False值之间取一个OR,如果任何行包含2022-02,则给予True
  4. calender[...]使用上面的布尔级数只获取您想要的行。
    希望这能解释下面的代码-
calender[calender.apply(lambda row: row.str.find('2022-02')>=0).any(1)]
Sunday      Monday     Tuesday   Wednesday    Thursday  \
February  2022-01-30  2022-01-31  2022-02-01  2022-02-02  2022-02-03   
February  2022-02-06  2022-02-07  2022-02-08  2022-02-09  2022-02-10   
February  2022-02-13  2022-02-14  2022-02-15  2022-02-16  2022-02-17   
February  2022-02-20  2022-02-21  2022-02-22  2022-02-23  2022-02-24   
March     2022-02-27  2022-02-28  2022-03-01  2022-03-02  2022-03-03   

              Friday    Saturday  
February  2022-02-04  2022-02-05  
February  2022-02-11  2022-02-12  
February  2022-02-18  2022-02-19  
February  2022-02-25  2022-02-26  
March     2022-03-04  2022-03-05

避免将日期字符串作为2022-01-10 > 2022-02-11进行比较

在这里补充一点,对于后代来说,使用><=将日期作为字符串进行比较并不是一个好的做法,在这里的这篇流行的SO帖子中详细讨论了这一点。
此外,进行字符串比较时只会比较每个字符的Unicode值,因此很容易出现'10/15/13' > '10/12/14'这样的失败情况
因此,我强烈建议避免这些类型的编码实践。

fhity93d

fhity93d2#

从此代码中使用

df[(df.Saturday <= '2022-03-06')&(df.Sunday >= '2022-01-26')]

这是非常简单和快速的如果你的数据集在这一行之前很大,你可以使用from convert_dtypes方法(有时Pandas使用from object作为数据类型,这是非常慢的)

相关问题