Pandas date_range在月初生成月度数据

时间:2016-01-21 05:10:21

标签: python pandas date-range

我正在尝试生成每月数据的日期范围,其中的日期总是在月初:

pd.date_range(start='1/1/1980', end='11/1/1991', freq='M')

这会生成1/31/19802/29/1980,依此类推。相反,我只想要1/1/19802/1/1980,...

我已经看到了关于生成始终在每月特定日期的数据的其他问题,答案说这是不可能的,但肯定必须在月初开始!

2 个答案:

答案 0 :(得分:70)

您可以将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'表示开头(月份开始频率)。

答案 1 :(得分:1)

值得注意的是,Dimitris 建议的 'MS'pandas.date_range() 选项使范围从 月初开始,这可能不是预期的:< /p>

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)