Pandas筛选指定日期范围数据异常:代码无输出问题排查
Pandas日期筛选无输出问题解决
问题场景
需要从包含timestamp类型Date列的Pandas DataFrame中,筛选日期在2023-01-01至2023-01-31的所有行。测试数据如下:
df12=pd.DataFrame(data=['2023-01-02 09:15:00','2023-03-02 15:25:02','2023-03-02 15:45:00','2023-01-02 05:55:00','2023-03-02 05:55:00'],columns=['Date'])
数据展示:
Date 0 2023-01-02 09:15:00 1 2023-03-02 15:25:02 2 2023-03-02 15:45:00 3 2023-01-02 05:55:00 4 2023-03-02 05:55:00
执行以下代码后无输出,但预期应输出两行2023-01-02:
df12['Date'] = pd.to_datetime(df12['Date']) df12['Date'].dt.date start_date = '2023-01-01' end_date = '2023-01-31' date_range = pd.date_range(start=start_date, end=end_date) for i in df12['Date'].dt.date: if i in date_range: print(i)
问题原因
代码中df12['Date'].dt.date返回的是Python原生datetime.date对象,而pd.date_range生成的是Pandas的Timestamp对象,两种类型的对象无法直接通过in判断匹配,导致条件永远不成立,因此没有输出。
解决方案
方案1:直接使用Timestamp范围做布尔索引(推荐)
无需转换为date对象,直接对Timestamp列进行范围筛选,这是Pandas最常用的高效筛选方式:
import pandas as pd df12=pd.DataFrame(data=['2023-01-02 09:15:00','2023-03-02 15:25:02','2023-03-02 15:45:00','2023-01-02 05:55:00','2023-03-02 05:55:00'],columns=['Date']) df12['Date'] = pd.to_datetime(df12['Date']) start_date = '2023-01-01' end_date = '2023-01-31' # 筛选符合日期范围的行 filtered_rows = df12[(df12['Date'] >= start_date) & (df12['Date'] <= end_date)] # 输出日期部分 for date in filtered_rows['Date'].dt.date: print(date)
执行后会输出:
2023-01-02 2023-01-02
方案2:统一类型后再判断
如果要保留原循环的思路,需要把date_range转换为datetime.date对象的集合,确保两边类型一致:
import pandas as pd df12=pd.DataFrame(data=['2023-01-02 09:15:00','2023-03-02 15:25:02','2023-03-02 15:45:00','2023-01-02 05:55:00','2023-03-02 05:55:00'],columns=['Date']) df12['Date'] = pd.to_datetime(df12['Date']) start_date = '2023-01-01' end_date = '2023-01-31' # 将date_range转换为date对象的集合 date_set = set(pd.date_range(start=start_date, end=end_date).date) for i in df12['Date'].dt.date: if i in date_set: print(i)
同样能得到预期的两行输出。
内容的提问来源于stack exchange,提问作者R K
相关产品推荐
相关产品推荐

