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

