簡體   English   中英

使用熊貓獲取開始日期和結束日期之間的工作日

[英]Get business days between start and end date using pandas

我正在使用熊貓,我想知道使用熊貓獲取開始日期和結束日期之間的工作日的最簡單方法是什么?

有很多關於在 Python 中執行此操作的帖子( 例如),但我有興趣直接使用 Pandas,因為我認為 Pandas 可能可以很容易地處理這個問題。

date_range ,您也可以使用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)

編輯

或者更簡單

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)

請注意,開始日期和結束日期都包含在內。 來源: http : //pandas.pydata.org/pandas-docs/stable/generated/pandas.bdate_range.html

從 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')

使用 bdate_range 或 BDay() 時要小心 - 該名稱可能會誤導您認為這是一個工作日范圍,而實際上它只是去除周末的日歷日(即它不考慮假期) .

使用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

切片:

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

count()

In [191]: s.ix[x:y].asfreq(BDay()).count()
Out[191]: 3

這個答案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)

2019 年 3 月編輯:

DatetimeIndex替換為bdate_range用於pandas 0.24.0 更新

  • 不推薦通過傳遞范圍參數開始、結束和句點來創建 TimedeltaIndex、DatetimeIndex 或 PeriodIndex,取而代之的是 timedelta_range()、date_range() 或 period_range()

我們可以使用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')

如果您也在星期六工作或有一個不尋常的工作周,您還希望排除您所在國家/地區的公共假期。

import pandas as pd  
from datetime import datetime

weekmask = 'Sun Mon Tue Wed Thu'
exclude = [pd.datetime(2020, 5, 1),
           pd.datetime(2020, 5, 2),
           pd.datetime(2020, 5, 3)]

pd.bdate_range('2020/4/30','2020/5/26',
               freq='C',
               weekmask = weekmask,
               holidays=exclude )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM