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

关于Pandas is_year_end在工作日频率下判定逻辑的疑问

问题原因解析

这个现象的核心原因是:Pandas的is_year_end属性对于带有明确频率(freq)的DatetimeIndex,判断的是该频率序列内的年度最后一个元素,而非自然日历的年末日期。

具体验证代码

  • 工作日频率(freq='B')场景:
import pandas as pd

# 生成2017年所有工作日的索引
workday_idx = pd.date_range(start='2017-01-01', end='2017-12-31', freq='B')
# 筛选标记为年末的日期
print(workday_idx[workday_idx.is_year_end])
# 输出:DatetimeIndex(['2017-12-29'], dtype='datetime64[ns]', freq='B')
  • 默认日频率(freq='D')场景:
daily_idx = pd.date_range(start='2017-01-01', end='2017-12-31', freq='D')
print(daily_idx[daily_idx.is_year_end])
# 输出:DatetimeIndex(['2017-12-31'], dtype='datetime64[ns]', freq='D')

深层逻辑说明

当你用freq='B'生成DatetimeIndex时,这个索引只包含当年的工作日。2017年12月31日是周日(非工作日),不在这个索引序列里,而2017-12-29是当年最后一个工作日,也就是该频率序列中2017年的最后一个元素,因此is_year_end会将其标记为True。

而默认日频率的索引包含全年所有日期,自然年最后一天2017-12-31是序列的年度最后一个元素,所以被正确标记为年末。

Pandas官方文档未明确提及这一点,是因为这是频率索引的通用行为:所有类似is_year_end、is_quarter_end的周期属性,都会结合索引的频率规则来判断“周期终点”,而非单纯匹配自然日历的固定日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:04:52