Предыдущие (рабочие) даты pandas - PullRequest
1 голос
/ 07 февраля 2020

У меня есть pandas.core.series.Series из указанных c дат (не последовательных), который выглядит следующим образом:

0     1998-06-09
1     1998-08-07
2     1998-09-11
3     1998-10-13
4     1998-11-03
...   
231   2019-07-25
232   2019-09-12
233   2019-10-24

Эти даты не обязательно являются рабочими днями. Что мне нужно, это создать список или серию дат, которые представляют предыдущий день в списке, который у меня есть. В новом списке каждый предыдущий день должен быть рабочим днем, т. Е. Если (скажем) 1998-06-09 был понедельник, в новом списке я должен получить 1998-06-05, т. Е. Предыдущую пятницу. Есть предложения?

1 Ответ

4 голосов
/ 07 февраля 2020

pd.offsets.BusinessDay

Если вы считаете рабочий день понедельником - пятницей

df['prev_bd'] = df['Date'] - pd.offsets.BusinessDay(n=1)
        Date    prev_bd
0 2012-12-20 2012-12-19
1 2012-12-21 2012-12-20
2 2012-12-22 2012-12-21
3 2012-12-23 2012-12-21
4 2012-12-24 2012-12-21
5 2012-12-25 2012-12-24
6 2012-12-26 2012-12-25
7 2012-12-27 2012-12-26
8 2012-12-28 2012-12-27
9 2012-12-29 2012-12-28

pd.offsets.CustomBusinessDay

Когда вы также хотите пропустить праздники (или любой другой набор дат в частности). Здесь мы исключаем федеральные праздники, хотя вы можете пропустить любые даты, которые вы хотите, указав соответствующий календарь.

from pandas.tseries.holiday import USFederalHolidayCalendar
df['prev_nohol'] = df['Date'] - pd.offsets.CustomBusinessDay(n=1, calendar=USFederalHolidayCalendar())
#PerformanceWarning

        Date    prev_bd prev_nohol
0 2012-12-20 2012-12-19 2012-12-19
1 2012-12-21 2012-12-20 2012-12-20
2 2012-12-22 2012-12-21 2012-12-21
3 2012-12-23 2012-12-21 2012-12-21
4 2012-12-24 2012-12-21 2012-12-21
5 2012-12-25 2012-12-24 2012-12-24
6 2012-12-26 2012-12-25 2012-12-24  # Christmas skipped because Federal Holiday
7 2012-12-27 2012-12-26 2012-12-26
8 2012-12-28 2012-12-27 2012-12-27
9 2012-12-29 2012-12-28 2012-12-28

Пример данных

import pandas as pd
df = pd.DataFrame({'Date': pd.date_range('2012-12-20', periods=10, freq='D')})
...