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

Pandas date_range不符合预期:为何未生成2023年起始时间?

Pandas date_range 年度起始频率生成未包含预期时间点的问题

问题复现

执行代码:

pd.date_range('2022-01-01 15:00', '2023-02-02 00:00', freq='YS')

实际返回结果:

DatetimeIndex(['2022-01-01 15:00:00'], dtype='datetime64[ns]', freq='AS-JAN')

但预期应包含2023-01-01 15:00:00,即:

DatetimeIndex(['2022-01-01 15:00:00', '2023-01-01 15:00:00'], dtype='datetime64[ns]', freq='AS-JAN')

该行为确实反直觉,属于设计上的不合理之处。

原因分析

Pandas在处理YS(年度起始)这类年度级频率时,内部逻辑会以年份边界作为判断依据,而非严格比较生成的时间点与结束时间的大小。即使2023-01-01 15:00:00早于给定的结束时间2023-02-02 00:00:00,也会因为该时间点属于2023年度,而原结束时间的年度范围被判定为不包含完整的2023年度周期,从而被排除在外。

实现预期效果的方法

方法1:指定生成周期数

直接通过periods参数指定要生成的年度起始点数量,避免依赖结束时间的判断逻辑:

pd.date_range('2022-01-01 15:00', periods=2, freq='YS')

此方法会直接生成2022和2023年1月1日15:00的时间点,完全符合预期。

方法2:基于周期范围转换

先生成年度周期,再转换为带指定时分秒的时间戳:

# 生成2022到2023年的年度周期
periods = pd.period_range('2022', '2023', freq='Y')
# 转换为年度起始时间,并加上15小时的偏移
dt_index = periods.to_timestamp(how='start') + pd.Timedelta(hours=15)

方法3:手动补充目标时间点

如果需要保留原结束时间的过滤逻辑,可以先生成初始结果,再手动添加符合条件的时间点:

base_index = pd.date_range('2022-01-01 15:00', '2023-02-02 00:00', freq='YS')
# 检查目标时间点是否在结束时间之前,若符合则添加
target_time = pd.Timestamp('2023-01-01 15:00')
if target_time <= pd.Timestamp('2023-02-02 00:00'):
    base_index = base_index.append(pd.DatetimeIndex([target_time]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:29