Python Pandas добавляет столбец смещения даты с пользовательским рабочим днем ​​(CDay; CustomBusinessDay) - PullRequest
0 голосов
/ 16 октября 2018

Я хочу добавить настраиваемый столбец смещения рабочего дня в столбец даты:

>> import pandas as pd
>> from pandas.tseries.offsets import CustomBusinessDay

>> df = pd.DataFrame({'ship_date_et': ['2018-10-01' for x in range(10)], 'offset': [x for x in range(10)]})

>> df['offset'] = pd.to_timedelta(df['offset'], unit='D')

>> df['ship_date_et'] = pd.to_datetime(df['ship_date_et'])

>> df.dtypes
offset          timedelta64[ns]
ship_date_et     datetime64[ns]

>> df
    offset ship_date_et
0   0 days  2018-10-01
1   1 days  2018-10-01
2   2 days  2018-10-01
3   3 days  2018-10-01
4   4 days  2018-10-01
5   5 days  2018-10-01
6   6 days  2018-10-01
7   7 days  2018-10-01
8   8 days  2018-10-01
9   9 days  2018-10-01

>> holidays = ['2018-10-10'] # '2018-10-10' just a made-up holiday

>> cdays = CustomBusinessDay(holidays=holidays, weekmask='Mon Tue Wed Thu Fri') 

>> df['ship_date_et'] + df['offset'].apply(cdays)
0   2018-10-02
1   2018-10-03
2   2018-10-04
3   2018-10-05
4   2018-10-06
5   2018-10-07
6   2018-10-08
7   2018-10-09
8   2018-10-10
9   2018-10-11
dtype: datetime64[ns]

Что сумасшедшего неправильно.Выходные (2018-10-06 и 2018-10-07) не рассчитываются (в документации Pandas сказано, что CDay включает выходные).Что не относится к тому, что я определил только 2 weekmask дней (понедельник и вторник).

Я действительно смущен и расстроен, потому что это работает нормально BDay:

>> df['ship_date_et'] + df['offset'].dt.days.apply(BDay) # Doing dt.days to get integer for BDay since we defined df['offset'] as a `timedelta`
0   2018-10-01
1   2018-10-02
2   2018-10-03
3   2018-10-04
4   2018-10-05
5   2018-10-08
6   2018-10-09
7   2018-10-10
8   2018-10-11
9   2018-10-12

Мой желаемый результат:

>> df['ship_date_et'] + df['offset'].apply(cdays)
0   2018-10-01
1   2018-10-02
2   2018-10-03
3   2018-10-04
4   2018-10-05
5   2018-10-08
6   2018-10-09
7   2018-10-11
8   2018-10-12
9   2018-10-15

Я прочиталдокументы (оба numpy busday и Pandas) и поиск в Интернете, например, здесь и здесь ), но не может найти причину того, что происходит.Самое важное, что мое определение cdays в index=0 равно 0 days, но результат возвращает мои ship_date_et days + 1.

Конечно, есть проблема с использованием apply и:

PerformanceWarning: Adding/subtracting array of DateOffsets to Series not vectorized "Series not vectorized"

Панды дает.

Буду признателен за любые отзывы или комментарии.Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

@ dlstadther, хотя ваш ответ не дал мне смещения даты, выходные и праздничные дни не рассматривались как нули.Я думаю, что это связано с моей реализацией df['offset'] как type timedelta.Это привело к:

>> (df['ship_date_et'] + df['offset']).apply(cdays)
0   2018-10-02
1   2018-10-03
2   2018-10-04
3   2018-10-05
4   2018-10-08
5   2018-10-08
6   2018-10-08
7   2018-10-09
8   2018-10-11
9   2018-10-11
dtype: datetime64[ns]

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

Мой ответ:

С небольшим сном и раздражением:

>> df['new'] = df['ship_date_et'] + df['offset'].dt.days*cdays

то, что я искал.

>> df
offset ship_date_et        new
0 0 days   2018-10-01 2018-10-01
1 1 days   2018-10-01 2018-10-02
2 2 days   2018-10-01 2018-10-03
3 3 days   2018-10-01 2018-10-04
4 4 days   2018-10-01 2018-10-05
5 5 days   2018-10-01 2018-10-08
6 6 days   2018-10-01 2018-10-09
7 7 days   2018-10-01 2018-10-11
8 8 days   2018-10-01 2018-10-12
9 9 days   2018-10-01 2018-10-15

, где пропускаются «праздники» и выходные дни в этом примере, а счетчик продолжает их, как BDay.

Если df['offset']имеет тип int, не будет делать .dt.days.

0 голосов
/ 16 октября 2018

Похоже, что вы применяете только cdays к смещению, а не ship_date + offset.

(df['ship_date_et'] + df['offset']).apply(cdays)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...