pd.date_range()的inclusive参数使用误区及预期序列生成方案
问题解答
1. 生成预期的每月首日序列
核心是选对日期频率,要生成每月首日,需使用freq="MS"(Month Start,代表每月第一天的频率),而非你之前用的freq="M"(Month End,代表每月最后一天的频率)。
方案一:直接指定首尾首日区间
import pandas as pd # 生成2020-01-01到2022-12-01的每月首日序列 date_series = pd.date_range(start='2020-01-01', end='2022-12-01', freq='MS')
默认inclusive="both"会自动包含首尾两个边界日期,完全符合预期输出。
方案二:保留原end日期参数
如果坚持使用end='31/12/2022',freq="MS"也会自动生成不超过该日期的所有每月首日,结果同样包含2022-12-01:
date_series = pd.date_range(start='2020-01-01', end='31/12/2022', freq='MS')
2. 对inclusive参数的误解
你之前的代码问题根源是选错了freq,但对inclusive的功能也存在几个关键误解:
inclusive只作用于序列内的边界日期:它不会改变freq的生成逻辑(比如把末日序列改成首日序列)。你用freq="M"生成的是每月末日,而start='01/01/2020'是首日,根本不在这个序列里,所以inclusive="left"无法让序列包含该日期。inclusive不改变日期类型:它只是在freq生成的完整序列基础上,决定是否保留start和end这两个点(前提是这两个点属于该序列)。比如你用freq="M"且end='31/12/2022',这个end是序列中的2022-12-31,inclusive="left"会排除这个点,导致你看不到12月的记录,但这和你要的首日序列需求无关。- 忽略了边界日期与
freq的匹配性:使用inclusive时,需要确保start和end是freq序列中的有效日期,否则参数无法起到你期望的边界控制作用。比如要生成首日序列,start和end应该是某月的第一天,这样inclusive才能正确控制是否包含它们。
内容的提问来源于stack exchange,提问作者Andrea Ciufo
相关产品推荐
相关产品推荐

