You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含空值的Pandas DataFrame如何正确筛选指定日期范围的数据?

解决Pandas日期列的空值+指定范围筛选问题

首先啊,你遇到的核心问题大概率是日期列的类型不对——如果你的date_column还是字符串(object类型),直接用日期范围筛选肯定行不通,而且空值处理也会混乱。咱们一步步来解决:


第一步:把日期列转换成标准datetime类型

原始数据里混着日期字符串和空值/无效值(比如你示例里的...),先统一转换成Pandas能识别的datetime格式,用errors='coerce'把无效内容转成Pandas的空日期标记NaT,方便后续处理:

import pandas as pd

# 转换日期列类型
df['date_column'] = pd.to_datetime(df['date_column'], errors='coerce')

第二步:构建筛选条件并应用

我们需要筛选空值(NaT) 或者 在指定日期范围内 的数据,用逻辑运算符把两个条件合并:

# 定义你要筛选的日期范围
start_date = '2017-01-01'
end_date = '2018-01-01'

# 组合条件:空值 或 日期在范围内
filter_condition = df['date_column'].isna() | ((df['date_column'] >= start_date) & (df['date_column'] <= end_date))

# 得到筛选后的结果
filtered_df = df[filter_condition]

为啥你之前的方法没效果?

  • 第一个方法df[df['date_column'].loc['2017-01-01':'2018-01-01']]:loc是用来按行索引/列标签切片的,不是用来筛选列值范围的,逻辑完全不对。
  • 第二个方法isin(pd.date_range(...)):date_range生成的是离散的日期列表(比如你写的两个月末日期),只会匹配正好等于这些日期的行,不是范围筛选。
  • 第三个方法str.contains():如果列转成了datetime类型,调用str属性会直接报错;如果还是字符串类型,正则写起来麻烦,还容易匹配到不符合格式的内容,空值处理也会出问题。

验证结果

用你给出的示例数据,筛选2017-01-01到2018-01-01的范围后,会得到:

  • 所有空值/NaT的行(比如行16、28、30、40、41、47、48这些)
  • 符合范围的日期行:2017-05-30、2018-01-26

这样就完全符合你的需求啦~

内容的提问来源于stack exchange,提问作者user3732793

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:08:48