Pandas date_range 在月初生成月度数据
Pandas date_range to generate monthly data at beginning of the month
我正在尝试生成月度数据的日期范围,其中日期总是在月初:
pd.date_range(start='1/1/1980', end='11/1/1991', freq='M')
这会生成 1/31/1980
、2/29/1980
等。相反,我只想要 1/1/1980
、2/1/1980
、...
我看到其他问题询问关于生成始终在一个月中特定日期的数据,答案说这是不可能的,但月初肯定是可能的!
您可以将 freq
参数从 'M'
更改为 'MS'
:
d = pandas.date_range(start='1/1/1980', end='11/1/1990', freq='MS')
print(d)
现在应该打印:
DatetimeIndex(['1980-01-01', '1980-02-01', '1980-03-01', '1980-04-01',
'1980-05-01', '1980-06-01', '1980-07-01', '1980-08-01',
'1980-09-01', '1980-10-01',
...
'1990-02-01', '1990-03-01', '1990-04-01', '1990-05-01',
'1990-06-01', '1990-07-01', '1990-08-01', '1990-09-01',
'1990-10-01', '1990-11-01'],
dtype='datetime64[ns]', length=131, freq='MS', tz=None)
查看文档的 offset aliases 部分。它指出 'M'
表示月末(月末频率),而 'MS'
表示月初(月开始频率)。
值得注意的是,Dimitris 建议的 pandas.date_range()
的 'MS'
选项使范围从 下一个 月份的月初开始,这可能预计不会:
start = "2020-03-08"
end = "2021-03-08"
pd.date_range(start, end, freq='MS')
结果
DatetimeIndex(['2020-04-01', '2020-05-01', '2020-06-01', '2020-07-01',
'2020-08-01', '2020-09-01', '2020-10-01', '2020-11-01',
'2020-12-01', '2021-01-01', '2021-02-01', '2021-03-01'],
dtype='datetime64[ns]', freq='MS')
解决方法是仅使用开始日期的年份和月份:
pd.date_range(start[:7], end, freq='MS')
然后会给
DatetimeIndex(['2020-03-01', '2020-04-01', '2020-05-01', '2020-06-01',
'2020-07-01', '2020-08-01', '2020-09-01', '2020-10-01',
'2020-11-01', '2020-12-01', '2021-01-01', '2021-02-01',
'2021-03-01'],
dtype='datetime64[ns]', freq='MS')
如果您希望每个月的起始日都相同,您可以添加偏移量 pd.DateOffset()
:
pd.date_range(start[:7], end, freq='MS') + pd.DateOffset(days=7)
会给
DatetimeIndex(['2020-03-08', '2020-04-08', '2020-05-08', '2020-06-08',
'2020-07-08', '2020-08-08', '2020-09-08', '2020-10-08',
'2020-11-08', '2020-12-08', '2021-01-08', '2021-02-08',
'2021-03-08'],
dtype='datetime64[ns]', freq=None)
我正在尝试生成月度数据的日期范围,其中日期总是在月初:
pd.date_range(start='1/1/1980', end='11/1/1991', freq='M')
这会生成 1/31/1980
、2/29/1980
等。相反,我只想要 1/1/1980
、2/1/1980
、...
我看到其他问题询问关于生成始终在一个月中特定日期的数据,答案说这是不可能的,但月初肯定是可能的!
您可以将 freq
参数从 'M'
更改为 'MS'
:
d = pandas.date_range(start='1/1/1980', end='11/1/1990', freq='MS')
print(d)
现在应该打印:
DatetimeIndex(['1980-01-01', '1980-02-01', '1980-03-01', '1980-04-01',
'1980-05-01', '1980-06-01', '1980-07-01', '1980-08-01',
'1980-09-01', '1980-10-01',
...
'1990-02-01', '1990-03-01', '1990-04-01', '1990-05-01',
'1990-06-01', '1990-07-01', '1990-08-01', '1990-09-01',
'1990-10-01', '1990-11-01'],
dtype='datetime64[ns]', length=131, freq='MS', tz=None)
查看文档的 offset aliases 部分。它指出 'M'
表示月末(月末频率),而 'MS'
表示月初(月开始频率)。
值得注意的是,Dimitris 建议的 pandas.date_range()
的 'MS'
选项使范围从 下一个 月份的月初开始,这可能预计不会:
start = "2020-03-08"
end = "2021-03-08"
pd.date_range(start, end, freq='MS')
结果
DatetimeIndex(['2020-04-01', '2020-05-01', '2020-06-01', '2020-07-01',
'2020-08-01', '2020-09-01', '2020-10-01', '2020-11-01',
'2020-12-01', '2021-01-01', '2021-02-01', '2021-03-01'],
dtype='datetime64[ns]', freq='MS')
解决方法是仅使用开始日期的年份和月份:
pd.date_range(start[:7], end, freq='MS')
然后会给
DatetimeIndex(['2020-03-01', '2020-04-01', '2020-05-01', '2020-06-01',
'2020-07-01', '2020-08-01', '2020-09-01', '2020-10-01',
'2020-11-01', '2020-12-01', '2021-01-01', '2021-02-01',
'2021-03-01'],
dtype='datetime64[ns]', freq='MS')
如果您希望每个月的起始日都相同,您可以添加偏移量 pd.DateOffset()
:
pd.date_range(start[:7], end, freq='MS') + pd.DateOffset(days=7)
会给
DatetimeIndex(['2020-03-08', '2020-04-08', '2020-05-08', '2020-06-08',
'2020-07-08', '2020-08-08', '2020-09-08', '2020-10-08',
'2020-11-08', '2020-12-08', '2021-01-08', '2021-02-08',
'2021-03-08'],
dtype='datetime64[ns]', freq=None)