【问题标题】:Pandas date_range to generate monthly data at beginning of the monthPandas date_range 在月初生成月度数据
【发布时间】:2016-04-27 05:32:11
【问题描述】:

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

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

这会生成1/31/19802/29/1980 等等。相反,我只想要1/1/19802/1/1980,...

我看到其他关于生成始终在一个月中的特定日期的数据的问题,答案说这是不可能的,但月的开始肯定是可能的!

【问题讨论】:

    标签: python pandas date-range


    【解决方案1】:

    您可以通过将 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' 是月初(月初频率)。

    【讨论】:

      【解决方案2】:

      值得注意的是,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)
      

      【讨论】:

      • 如果想要的日期是 29 日而 2 月有 28 天,这会导致麻烦。
      • @anishtain4 正确(对于最后一部分,添加偏移量)。实际上,这种方法的问题在于任何等于或大于 28 的偏移量。
      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 2012-01-08
      • 2020-08-28
      • 2023-01-26
      • 1970-01-01
      • 2021-11-01
      • 2021-03-24
      相关资源
      最近更新 更多