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

如何让pandas的date_range()包含日期区间两端的月份

问题原因

当使用freq='M'时,pd.date_range会生成每月最后一天的时间戳。你的结束日期是2022-04-05,而四月的最后一天是2022-04-30——这个日期晚于你的结束日期,所以默认不会被包含进结果。

inclusive参数的作用是控制是否包含传入的起始/结束边界点本身,而非边界点所在的整个月份。由于2022-04-30不在2022-01-13到2022-04-05的区间内,所以无论inclusive设为'both'还是'right',都不会包含四月的月末日期。

解决方案

以下几种方法都可以生成包含1-4月的月度日期列表:

方法1:调整结束日期为所在月的最后一天

手动指定结束日期为当月最后一天,或者自动计算该日期:

import pandas as pd

# 方式A:手动指定结束日期为当月最后一天
result = pd.date_range("2022-01-13", "2022-04-30", freq='M', inclusive='both')

# 方式B:自动获取结束日期所在月的最后一天
end_date = pd.Timestamp("2022-04-05")
result = pd.date_range("2022-01-13", end_date.to_period('M').end_time, freq='M', inclusive='both')

执行后得到:
DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30'], dtype='datetime64[ns]', freq='M')

方法2:先取每月第一天,再转换为月末日期

使用freq='MS'(每月第一天)生成序列,该频率下2022-04-01早于结束日期2022-04-05,会被包含,之后再转为月末日期:

# 生成每月第一天的序列
ms_range = pd.date_range("2022-01-13", "2022-04-05", freq='MS', inclusive='both')
# 转换为当月最后一天
result = ms_range + pd.offsets.MonthEnd(0)

方法3:使用PeriodRange生成月份区间,再转时间戳

先生成月份周期对象,再转换为月末时间戳:

# 生成包含起始和结束月份的周期序列
periods = pd.period_range(start="2022-01-13", end="2022-04-05", freq='M')
# 转换为月末时间戳
result = periods.to_timestamp(how='end')

以上三种方法在Pandas 1.5.3版本中均有效,最终结果都包含1-4月的月末日期,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:33:21