Pandas date_range在月初生成月度数据

Bun*_*oss 48 python date-range pandas

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

pd.date_range(start='1/1/1980', end='11/1/1991', freq='M')
Run Code Online (Sandbox Code Playgroud)

这会生成1/31/1980,2/29/1980等等.相反,我只是想1/1/1980,2/1/1980...

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

Jim*_*ard 87

您可以通过将freq参数更改'M''MS':

d = pandas.date_range(start='1/1/1980', end='11/1/1990', freq='MS')    
print(d)
Run Code Online (Sandbox Code Playgroud)

现在应该打印:

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)
Run Code Online (Sandbox Code Playgroud)

查看文档中的偏移别名部分.它表示'M'月末(月末频率)'MS'和月末(月份开始频率).


Ski*_*rou 14

值得注意的是,pandas.date_range()仅包含定义间隔内的日期,这可能不是预期的\xe2\x80\xaf:

\n
start = "2020-03-08"\nend = "2021-03-08"\npd.date_range(start, end, freq='MS')\n
Run Code Online (Sandbox Code Playgroud)\n

结果是

\n
DatetimeIndex(['2020-04-01', '2020-05-01', '2020-06-01', '2020-07-01',\n           '2020-08-01', '2020-09-01', '2020-10-01', '2020-11-01',\n           '2020-12-01', '2021-01-01', '2021-02-01', '2021-03-01'],\n          dtype='datetime64[ns]', freq='MS')\n
Run Code Online (Sandbox Code Playgroud)\n

对于MS,包含开始月份的第一天的解决方法是仅使用开始日期\xe2\x80\xaf 的年份和月份:

\n
pd.date_range(start[:7], end, freq='MS')\n
Run Code Online (Sandbox Code Playgroud)\n

然后会给出

\n
DatetimeIndex(['2020-03-01', '2020-04-01', '2020-05-01', '2020-06-01',\n           '2020-07-01', '2020-08-01', '2020-09-01', '2020-10-01',\n           '2020-11-01', '2020-12-01', '2021-01-01', '2021-02-01',\n           '2021-03-01'],\n          dtype='datetime64[ns]', freq='MS')\n
Run Code Online (Sandbox Code Playgroud)\n

如果您希望每个月保持相同的起始日,则可以使用pd.DateOffset()\xe2\x80\xaf 添加偏移量:

\n
pd.date_range(start[:7], end, freq='MS') + pd.DateOffset(days=7)\n
Run Code Online (Sandbox Code Playgroud)\n

会给

\n
DatetimeIndex(['2020-03-08', '2020-04-08', '2020-05-08', '2020-06-08',\n           '2020-07-08', '2020-08-08', '2020-09-08', '2020-10-08',\n           '2020-11-08', '2020-12-08', '2021-01-08', '2021-02-08',\n           '2021-03-08'],\n          dtype='datetime64[ns]', freq=None)\n
Run Code Online (Sandbox Code Playgroud)\n

正如评论中提到的,请注意,对于高于或等于 28 的偏移量,此解决方法可能会出现问题。

\n