Разница между датами и временем с точки зрения количества рабочих дней с использованием панд - PullRequest
1 голос
/ 23 мая 2019

Существует ли (более) удобный / эффективный метод для расчета количества рабочих дней между датами с использованием панд?

Я мог бы сделать

len(pd.bdate_range(start='2018-12-03',end='2018-12-14'))-1 # minus one only if end date is a business day

но для более длинных расстояний между началом и концом дня это кажется довольно неэффективным.

Есть несколько предложений о том, как использовать объект смещения BDay, но все они, похоже, относятся к созданию диапазонов дат или к чему-то подобному.

Я больше думаю об объекте Timedelta, который представлен в рабочих днях.

Скажем, у меня есть две серии, s1 и s2, содержащие datetime. Если у панд было что-то вроде

s1.dt.subtract(s2,freq='B') 
# giving a new series containing timedeltas where the number of days calculated
# use business days only

было бы неплохо.

(у numpy есть метод busday_count(). Но я бы не хотел конвертировать метки времени для своих панд в numpy, поскольку это может запутаться.)

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Я думаю, np.busday_count вот хорошая идея, также не требуется преобразовывать массивы в numpy:

s1 = pd.Series(pd.date_range(start='05/01/2019',end='05/10/2019'))
s2 = pd.Series(pd.date_range(start='05/04/2019',periods=10, freq='5d'))

s = pd.Series([np.busday_count(a, b) for a, b in zip(s1, s2)])
print (s)
0     3
1     5
2     7
3    10
4    14
5    17
6    19
7    23
8    25
9    27
dtype: int64
0 голосов
/ 23 мая 2019
#create dataframes with the dates
df=pd.DataFrame({'dates':pd.date_range(start='05/01/2019',end='05/31/2019')})
#check if the dates are in business days
df[df['dates'].isin(pd.bdate_range(df['dates'].get(0), df['dates'].get(len(df)-1)))]

out[]:
0   2019-05-01
1   2019-05-02
2   2019-05-03
5   2019-05-06
6   2019-05-07
7   2019-05-08
8   2019-05-09
9   2019-05-10
12  2019-05-13
13  2019-05-14
14  2019-05-15
15  2019-05-16
16  2019-05-17
19  2019-05-20
20  2019-05-21
21  2019-05-22
22  2019-05-23
23  2019-05-24
26  2019-05-27
27  2019-05-28
28  2019-05-29
29  2019-05-30
30  2019-05-31
0 голосов
/ 23 мая 2019
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)
источник Получите рабочие дни между начальной и конечной датами, используя панд
...