Pandas смещение рабочего дня: запрос простого примера - PullRequest
0 голосов
/ 01 марта 2020

У меня есть датафрейм "df" с индексом даты и времени. Вот приблизительный снимок его размеров:

            V1  V2  V3  V4  V5
1/12/2008   4   15  11  7   1
1/13/2008   5   2   8   7   1
1/14/2008   13  13  9   6   4
1/15/2008   14  15  12  9   3
1/16/2008   1   10  2   12  15
1/17/2008   10  5   9   9   1
1/18/2008   13  11  5   7   2
1/19/2008   2   6   7   9   6
1/20/2008   5   4   14  3   7
1/21/2008   11  11  4   7   15
1/22/2008   9   4   15  10  3
1/23/2008   2   13  13  10  3
1/24/2008   12  15  14  12  8
1/25/2008   1   4   2   6   15

Некоторые дни в индексе - выходные и праздничные дни.

Я хотел бы переместить все даты в индексе даты и времени "df" на соответствующий ближайший (США) рабочий день (т. Е. С понедельника по пятницу, исключая праздничные дни).

Как бы вы порекомендовали мне это сделать? Мне известно, что Pandas имеет для этого "смещение временных рядов" . Но я так и не смог найти пример, который поможет начинающему читателю пройти через это.

Вы можете помочь?

1 Ответ

1 голос
/ 01 марта 2020

Я не знаком с этим классом, но, посмотрев на исходный код, кажется, довольно просто добиться этого. Имейте в виду, что он выбирает ближайший рабочий день следующий , означающий, что суббота превращается в понедельник, а не в пятницу. Если сделать ваш индекс неуникальным, то снизит производительность в вашем DataFrame, поэтому я предлагаю назначить эти значения новому столбцу.

Единственное предварительное условие - вы должны убедиться, что ваш индекс любой из этих трех типов, datetime , timedelta, pd.tseries.offsets.Tick .

offset = pd.tseries.offsets.CustomBusinessDay(n=0)

df.assign(
    closest_business_day=df.index.to_series().apply(offset)
)

            V1  V2  V3  V4  V5 closest_business_day
2008-01-12   4  15  11   7   1           2008-01-14
2008-01-13   5   2   8   7   1           2008-01-14
2008-01-14  13  13   9   6   4           2008-01-14
2008-01-15  14  15  12   9   3           2008-01-15
2008-01-16   1  10   2  12  15           2008-01-16
2008-01-17  10   5   9   9   1           2008-01-17
2008-01-18  13  11   5   7   2           2008-01-18
2008-01-19   2   6   7   9   6           2008-01-21
2008-01-20   5   4  14   3   7           2008-01-21
2008-01-21  11  11   4   7  15           2008-01-21
2008-01-22   9   4  15  10   3           2008-01-22
2008-01-23   2  13  13  10   3           2008-01-23
2008-01-24  12  15  14  12   8           2008-01-24
2008-01-25   1   4   2   6  15           2008-01-25
...