使用pandas在开始日期和结束日期之间获取工作日

Tho*_*mel 24 python pandas

我正在使用熊猫,我想知道使用熊猫在开始日期和结束日期之间的最简单方法是什么?

关于在Python中执行此操作有很多帖子(例如),但我有兴趣直接使用pandas,因为我认为pandas可能很容易处理这个问题.

Rom*_*ain 36

您也可以date_range用于此目的.

In [3]: pd.date_range('2011-01-05', '2011-01-09', freq=BDay())

Out[3]: DatetimeIndex(['2011-01-05', '2011-01-06', '2011-01-07'], dtype='datetime64[ns]', freq='B', tz=None)
Run Code Online (Sandbox Code Playgroud)

编辑

或者更简单

In [7]: pd.bdate_range('2011-01-05', '2011-01-09')

Out[7]: DatetimeIndex(['2011-01-05', '2011-01-06', '2011-01-07'], dtype='datetime64[ns]', freq='B', tz=None)
Run Code Online (Sandbox Code Playgroud)

请注意,开始日期和结束日期都包括在内.资料来源:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.bdate_range.html


Ive*_*lin 23

从v0.14起,您可以使用假日日历.

from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay

us_bd = CustomBusinessDay(calendar=USFederalHolidayCalendar())
print pd.DatetimeIndex(start='2010-01-01',end='2010-01-15', freq=us_bd)

收益:

DatetimeIndex(['2010-01-04', '2010-01-05', '2010-01-06', '2010-01-07',
               '2010-01-08', '2010-01-11', '2010-01-12', '2010-01-13',
               '2010-01-14', '2010-01-15'],
              dtype='datetime64[ns]', freq='C')

  • 如果您想要日期范围之间的天数,您可以将其设为 `pd.DatetimeIndex(start='2010-01-01',end='2010-01-15',freq=us_bd).shape[0 ]` (3认同)

roo*_*oot 15

使用BDay()得到工作日的范围内.

from pandas.tseries.offsets import *

In [185]: s
Out[185]: 
2011-01-01   -0.011629
2011-01-02   -0.089666
2011-01-03   -1.314430
2011-01-04   -1.867307
2011-01-05    0.779609
2011-01-06    0.588950
2011-01-07   -2.505803
2011-01-08    0.800262
2011-01-09    0.376406
2011-01-10   -0.469988
Freq: D

In [186]: s.asfreq(BDay())
Out[186]: 
2011-01-03   -1.314430
2011-01-04   -1.867307
2011-01-05    0.779609
2011-01-06    0.588950
2011-01-07   -2.505803
2011-01-10   -0.469988
Freq: B
Run Code Online (Sandbox Code Playgroud)

切片:

In [187]: x=datetime(2011, 1, 5)

In [188]: y=datetime(2011, 1, 9)

In [189]: s.ix[x:y]
Out[189]: 
2011-01-05    0.779609
2011-01-06    0.588950
2011-01-07   -2.505803
2011-01-08    0.800262
2011-01-09    0.376406
Freq: D

In [190]: s.ix[x:y].asfreq(BDay())
Out[190]: 
2011-01-05    0.779609
2011-01-06    0.588950
2011-01-07   -2.505803
Freq: B
Run Code Online (Sandbox Code Playgroud)

count()

In [191]: s.ix[x:y].asfreq(BDay()).count()
Out[191]: 3
Run Code Online (Sandbox Code Playgroud)


Lar*_*son 15

使用bdate_range或BDay()时要小心 - 这个名称可能误导你认为它是一个工作日的范围,而实际上它只是日历天被剥离的周末(即它不考虑假期) .

  • 尽管这并不是对问题的完整答案……这是一个非常重要的评论,属于已接受的答案——“BDay”这个名字具有误导性。圣诞节是工作日吗?如果不是周末,则以 BDay 为准。 (2认同)

Alp*_*pha 7

此答案xone之上,我们可以编写一个简短函数来返回美国交易所交易日

from xone import calendar

def business_dates(start, end):
    us_cal = calendar.USTradingCalendar()
    kw = dict(start=start, end=end)
    return pd.bdate_range(**kw).drop(us_cal.holidays(**kw))

In [1]: business_dates(start='2018-12-20', end='2018-12-31')
Out[1]: DatetimeIndex(['2018-12-20', '2018-12-21', '2018-12-24', '2018-12-26',
                       '2018-12-27', '2018-12-28', '2018-12-31'],
                      dtype='datetime64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)

编辑2019年3月:

更换DatetimeIndexbdate_rangepandas0.24.0更新

  • 不建议通过传递范围参数开始,结束和句点来创建TimedeltaIndex,DatetimeIndex或PeriodIndex,而建议使用timedelta_range(),date_range()或period_range()


sau*_*hik 5

我们可以使用pd.bdate_range.

例子:

In [1]: pd.bdate_range("2020-01-01", "2020-01-06")
Out[1]: DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-06'], dtype='datetime64[ns]', freq='B')
Run Code Online (Sandbox Code Playgroud)