关于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
相关产品推荐
相关产品推荐

