使用Pandas按日期范围过滤数据结果不符合预期,遗漏了什么?
错误原因
- 你当前使用字符串格式的日期做大小比较,字符串比较逻辑是逐字符比对ASCII编码,不会按照实际日期的先后顺序判断,例如
10/01/2021与4/29/2021比较时,首字符1的ASCII码小于4,会被误判为更早的日期,直接导致过滤结果不符合预期。 - 读取CSV文件时没有将
collectedDate字段转换为日期类型,Pandas默认会将该字段识别为字符串(object)类型,不支持日期维度的逻辑比较。
修复方案
修改核心点为:将参与比较的collectedDate字段和阈值日期统一转为datetime类型,使用日期逻辑做过滤。
修复后完整代码如下:
# -*- coding: utf-8 -*- import pandas as pd import sys from dateutil.relativedelta import relativedelta import datetime reload(sys) sys.setdefaultencoding('utf-8') today = datetime.date.today() three_mon_rel = relativedelta(months=-3) # 保留datetime类型,无需转为字符串 three_months_period = today + three_mon_rel # 读取CSV时直接将collectedDate解析为日期类型,匹配你使用的月/日/年格式 data = pd.read_csv( 'output.csv', parse_dates=['collectedDate'], date_format='%m/%d/%Y' ) # 此时比较按真实日期先后逻辑判断,结果符合预期 rslt_df = data[data['collectedDate'] >= three_months_period] print(rslt_df)
注:如果你使用的是Pandas 2.0以下版本,可将读取CSV时的
date_format参数替换为date_parser=lambda x: pd.to_datetime(x, format='%m/%d/%Y')即可正常运行。
内容的提问来源于stack exchange,提问作者Ernesto CD
相关产品推荐
相关产品推荐

