跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Python如何过滤出特定工作日的数据_利用dt.dayofweek判断结合布尔索引

dt.dayofweek 是 pandas 中用于提取日期工作日编号的属性,返回值范围是 0(周一)到 6(周日)。 dt.dayofweek 是什么,返回值范围是多少
dt.dayofweek
是 pandas 中
DatetimeIndex
或
Series.dt
的一个属性,用于提取日期对应的工作日编号。它返回整数, 周一为 0,周日为 6 ——这点非常关键,很多人误以为周一是 1 或周日是 0,结果过滤错。 注意:它只对
datetime64[ns]
类型有效;如果列是字符串或 object 类型,直接调用会报
AttributeError: Can only use .dt accessor with datetimelike values
。 使用前务必确认类型:
df['date'].dtype # 应该是 datetime64[ns] df['date'] = pd.to_datetime(df['date']) # 若非 datetime 类型,必须先转换
如何用布尔索引筛选出“周二和周四”的数据 核心就是构造一个布尔条件数组,传给 DataFrame 索引。比如要保留周二(1)和周四(3),写法是: 立即学习 “ Python免费学习笔记(深入) ”;
mask = (df['date'].dt.dayofweek == 1) | (df['date'].dt.dayofweek == 3) df_filtered = df[mask].copy()
更简洁的写法是用
isin()
: Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载
df_filtered = df[df['date'].dt.dayofweek.isin([1, 3])].copy()
必须用
.copy()
避免 SettingWithCopyWarning(尤其后续要修改新 DataFrame 时) 别用
and
/
or
,它们不支持数组运算,会报
ValueError: The truth value of a Series is ambiguous
用
|
(或)、
&
(与)、
~
(非),且每个条件必须加括号 过滤周末数据时容易忽略的时区和本地化问题 如果原始时间带时区(如
UTC
或
Asia/Shanghai
),
dt.dayofweek
按照该时区计算——但如果你按“北京时间周末”过滤,而数据是 UTC 时间,那直接用
dayofweek in [5, 6]
就会把周六凌晨(UTC)当成周五(北京时间),漏掉或错选。 稳妥做法: 统一转为所需时区再取 weekday:
df['date'].dt.tz_convert('Asia/Shanghai').dt.dayofweek
若原数据无时区,但业务逻辑按某地时间解释,可用
tz_localize
先打上时区,再转换 纯本地时间(无 tz)且不跨时区场景下,可跳过这步 性能差异:dayofweek vs. day_name() + isin 有人喜欢用
df['date'].dt.day_name().isin(['Tuesday', 'Thursday'])
,语义清晰但慢很多——因为
day_name()
返回字符串,涉及本地化、内存拷贝和逐元素比较;而
dayofweek
是 int 数组,底层用 numpy 向量化运算,快 3–5 倍(百万行数据实测)。 另外注意:
day_name()
默认按系统 locale 返回中文/英文名,跨环境可能不稳定
dayofweek
始终稳定返回 0–6 整数,适合生产环境 如果要做“每月第二个周三”这类复杂逻辑,
dayofweek
是基础,但需配合
dt.week
或
dt.day
组合判断 实际用的时候,别光记“周二=1”,先
df['date'].dt.dayofweek.value_counts().sort_index()
看一眼分布,比凭空假设靠谱得多。

相关文章