Python pandas dataframe日期区间筛选报错及结果异常问题求解
问题原因分析
- 第一种写法报错原因:
- pandas布尔索引的逐元素逻辑运算需要用位运算符
&,不能用Python原生的and,and会尝试将整个布尔序列转换为单个布尔值,触发ValueError。 - 你设置的时间索引是
edate列,但第一种写法中比较的是date字段,同时使用的日/月/年格式的日期字符串存在解析歧义,容易被pandas识别为月/日/年格式,导致筛选逻辑出错。
- pandas布尔索引的逐元素逻辑运算需要用位运算符
- 第二种写法返回异常数据原因:
你读取文件时仅指定了parse_dates=['date'],作为索引的edate列没有被解析为datetime类型,仍为字符串格式。使用loc[起始字符串:结束字符串]切片时,pandas会按字符串字典序而非日期逻辑比较,例如12/09/1965的字符串开头12小于14/09/2014的开头14,就会被误纳入筛选结果。
正确解决方法
首先修正数据读取逻辑,保证索引为datetime类型:
# 读取时同时解析date和edate列为datetime类型,将edate设为索引 df = pd.read_csv('https://manifestoproject.wzb.eu/down/data/2020b/datasets/MPDataset_MPDS2020b.csv', parse_dates=['date', 'edate'], index_col='edate')
之后可选择任意一种方式筛选:
- 布尔索引写法(兼容性更高,适合复杂筛选条件)
start = pd.to_datetime('2014-09-14') end = pd.to_datetime('2020-09-30') df = df.loc[(df.index >= start) & (df.index <= end)]
注意:每个判断条件需要用括号包裹,避免运算符优先级错误
- 时间索引切片写法(更简洁)
确认索引为datetime类型后,直接传入标准年-月-日格式的日期字符串即可:
df = df.loc['2014-09-14':'2020-09-30']
内容的提问来源于stack exchange,提问作者l0feic
相关产品推荐
相关产品推荐

