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

关于pd.date_range周频率未包含起止日期的技术问询

解决pd.date_range(freq="W")不包含起止日期的问题

当调用pd.date_range(start='2021-08-30', end='2021-11-8', freq="W")时,默认freq="W"对应每周日(W-SUN),但起止日期是周一,因此生成的序列不会包含这两个日期。以下是几种不硬编码指定周几的可行方案:

方案一:动态匹配起止日期的周几生成freq

先提取起始日期的星期标识,动态构建对应的周频率参数,无需手动指定W-MON、W-TUE这类固定值:

import pandas as pd

start_date = '2021-08-30'
end_date = '2021-11-8'

# 获取起始日期的星期缩写(如'Mon'),转为大写后拼接成freq
weekday_abbr = pd.to_datetime(start_date).strftime('%a').upper()
custom_freq = f'W-{weekday_abbr}'

# 生成日期序列
date_index = pd.date_range(start=start_date, end=end_date, freq=custom_freq)
print(date_index)

输出结果会包含起止日期:

DatetimeIndex(['2021-08-30', '2021-09-06', '2021-09-13', '2021-09-20',
               '2021-09-27', '2021-10-04', '2021-10-11', '2021-10-18',
               '2021-10-25', '2021-11-01', '2021-11-08'],
              dtype='datetime64[ns]', freq='W-MON')

方案二:补充起止日期后去重排序

如果不想修改freq参数,可以先生成默认的周序列,再将起止日期加入后去重并重新排序:

import pandas as pd

start_date = '2021-08-30'
end_date = '2021-11-8'

# 生成默认W序列
default_index = pd.date_range(start=start_date, end=end_date, freq="W")
# 转为集合添加起止日期,再转回DatetimeIndex并排序
full_index = pd.DatetimeIndex(sorted(set(default_index.tolist() + [pd.to_datetime(start_date), pd.to_datetime(end_date)])))
print(full_index)

输出结果会包含起止日期:

DatetimeIndex(['2021-08-30', '2021-09-05', '2021-09-06', '2021-09-12',
               '2021-09-13', '2021-09-19', '2021-09-20', '2021-09-26',
               '2021-09-27', '2021-10-03', '2021-10-04', '2021-10-10',
               '2021-10-11', '2021-10-17', '2021-10-18', '2021-10-24',
               '2021-10-25', '2021-10-31', '2021-11-01', '2021-11-07',
               '2021-11-08'],
              dtype='datetime64[ns]')

注意:此方案会保留原默认W序列的日期,同时添加起止日期,适合需要同时保留两种周频率日期的场景。

方案三:使用pandas的Week偏移量

利用pd.offsets.Week,以起始日期的星期为基准生成序列:

import pandas as pd

start_date = pd.to_datetime('2021-08-30')
end_date = pd.to_datetime('2021-11-8')

# 创建以起始日期星期为基准的Week偏移
week_offset = pd.offsets.Week(weekday=start_date.weekday())
# 生成序列,从start_date开始,直到end_date
date_index = pd.date_range(start=start_date, end=end_date, freq=week_offset)
print(date_index)

输出结果与方案一一致,包含起止日期:

DatetimeIndex(['2021-08-30', '2021-09-06', '2021-09-13', '2021-09-20',
               '2021-09-27', '2021-10-04', '2021-10-11', '2021-10-18',
               '2021-10-25', '2021-11-01', '2021-11-08'],
              dtype='datetime64[ns]', freq='<Week: weekday=0>')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:07:08