这个问题的解释是pd.to_datetime()函数默认将'%Y-%m'日期字符串转换为月份的第一天日期时间,或者'%Y-%m-01':
>>> pd.to_datetime('2016-05')
Timestamp('2016-05-01 00:00:00')
>>> pd.date_range('2016-01', '2016-02')
DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',
'2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08',
'2016-01-09', '2016-01-10', '2016-01-11', '2016-01-12',
'2016-01-13', '2016-01-14', '2016-01-15', '2016-01-16',
'2016-01-17', '2016-01-18', '2016-01-19', '2016-01-20',
'2016-01-21', '2016-01-22', '2016-01-23', '2016-01-24',
'2016-01-25', '2016-01-26', '2016-01-27', '2016-01-28',
'2016-01-29', '2016-01-30', '2016-01-31', '2016-02-01'],
dtype='datetime64[ns]', freq='D')
然后一切都随之而来。指定 freq='M' 包括 2016-01-01 和 2016-05-01 之间的月末,这是您收到的列表,不包括 2016-05-31。但是指定月份开始 'MS' 就像第二个答案提供的那样,包括 2016-05-01,因为它属于该范围。 pd.date_range() 默认行为与 range 方法不同,因为它包含结尾。来自the docs:
close 控制是否包含边界上的开始和结束。默认包括两端的边界点。