【问题标题】:bumping to good business day when generating range在生成范围时遇到良好的工作日
【发布时间】:2021-12-31 16:23:32
【问题描述】:

我正在使用 pandas pd.bdate_range() 来生成给定开始和结束的日期范围,但它似乎无法按预期工作。

我最终想要的是开始和结束日期上的季度日期,但我希望这些日期是有效的工作日。

start = '2015-06-01'
end = '2019-06-01'

dates = pd.bdate_range(start,end,freq='MS')[::3]

不幸的是,这包括 2018-09-01 星期六

有没有更简单的方法来获取仅包含工作日的索引,同时考虑 USFederalHolidayCalendar()

【问题讨论】:

    标签: python-3.x pandas date


    【解决方案1】:

    您可以像这样使用现有系列并增加到下一个工作日

    from pandas.tseries.offsets import BDay
    start = '2015-06-01'
    end = '2019-06-01'
    
    dates = pd.bdate_range(start,end,freq='MS')[::3]
    new_dates = dates.map(lambda x : x + 0*BDay())
    

    或者您可以像这样将BMS 传递给freq 关键字属性

    start = '2015-06-01'
    end = '2019-06-01'
    
    dates = pd.bdate_range(start,end, freq='BMS')[::3]
    

    两者都给出这个输出

    DatetimeIndex(['2015-06-01', '2015-09-01', '2015-12-01', '2016-03-01',
                   '2016-06-01', '2016-09-01', '2016-12-01', '2017-03-01',
                   '2017-06-01', '2017-09-01', '2017-12-01', '2018-03-01',
                   '2018-06-01', '2018-09-03', '2018-12-03', '2019-03-01',
                   '2019-06-03'],
                  dtype='datetime64[ns]', freq=None)
    

    【讨论】:

      【解决方案2】:

      我认为你可以通过以下来得到你想要的。

      freq='BMS' # 营业月开始

      freq='BQS' # 业务季度开始

      更新:

      你可以做这样的事情来照顾一个月/季度开始的假期。

      from pandas import DatetimeIndex
      from pandas.tseries.holiday import USFederalHolidayCalendar
      holidays = USFederalHolidayCalendar().holidays(start, end, return_name=False)
      month_dates = pandas.bdate_range(start, end, freq='CBMS', holidays=[holiday for holiday in holidays])
      print(month_dates)
      print(DatetimeIndex([e[1] for e in zip(month_dates.month, month_dates) if e[0] in {1, 4, 7, 10}]))
      

      DatetimeIndex(['2015-01-02', '2015-02-02', '2015-03-02', '2015-04-01', '2015-05-01', '2015-06-01', '2015-07-01', '2015-08-03', '2015-09-01', '2015-10-01', '2015-11-02', '2015-12-01', '2016-01-04', '2016-02-01', '2016-03-01', '2016-04-01', '2016-05-02', '2016-06-01', '2016-07-01', '2016-08-01', '2016-09-01', '2016-10-03', '2016-11-01', '2016-12-01', '2017-01-03', '2017-02-01', '2017-03-01', '2017-04-03', '2017-05-01', '2017-06-01', '2017-07-03', '2017-08-01', '2017-09-01', '2017-10-02', '2017-11-01', '2017-12-01', '2018-01-02', '2018-02-01', '2018-03-01', '2018-04-02', '2018-05-01', '2018-06-01', '2018-07-02', '2018-08-01', '2018-09-04', '2018-10-01', '2018-11-01', '2018-12-03', '2019-01-02', '2019-02-01', '2019-03-01', '2019-04-01', '2019-05-01'], dtype='datetime64[ns]', freq='CBMS')

      DatetimeIndex(['2015-01-02', '2015-04-01', '2015-07-01', '2015-10-01', '2016-01-04', '2016-04-01', '2016-07-01', '2016-10-03', '2017-01-03', '2017-04-03', '2017-07-03', '2017-10-02', '2018-01-02', '2018-04-02', '2018-07-02', '2018-10-01', '2019-01-02', '2019-04-01'], dtype='datetime64[ns]', freq=None)

      【讨论】:

      • 不幸的是,这会返回像 1 月 1 日这样的日期,这是美国的假期...
      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2012-02-21
      • 2011-12-11
      • 2022-01-18
      相关资源
      最近更新 更多