如何让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
相关产品推荐
相关产品推荐

