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():
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
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() 看一眼分布,比凭空假设靠谱得多。

















