Получить столбец с совокупным рабочим днем ​​для каждого месяца из pandas datetimeindex - PullRequest
2 голосов
/ 28 апреля 2020

Я пытаюсь получить вывод, аналогичный df.index.day, но с номером, соответствующим рабочему дню. Поэтому для 2020-04-06 я хочу 4 вместо 6.

Я ценю помощь.

Решение:

for i in range(len(df_21)):
    if ((i == 0) | (df_21.month[i-1] != df_21.month[i])):
        df_21.day[i] = 1
    elif ((df_21.day[i] - df_21.day[i-1]) != 1):
        df_21.day[i] = df_21.day[i-1] + 1

1 Ответ

0 голосов
/ 28 апреля 2020

Если у вас есть столбец datetime, как показано ниже, мы можем использовать pandas.bdate_range, чтобы проверить, какие даты являются рабочими днями, а затем использовать Series.cumsum, чтобы получить совокупную сумму:

df = pd.DataFrame({'date': pd.date_range('2020-04-01', '2020-04-07')})

        date
0 2020-04-01
1 2020-04-02
2 2020-04-03
3 2020-04-04
4 2020-04-05
5 2020-04-06
6 2020-04-07

Решение

# get date range of business days
business_days = pd.bdate_range(df['date'].min(), df['date'].max())

# check which dates are business days
bdays_bool = df['date'].isin(business_days)

# get the cumulative sums of all business days per month
df['nth_business_day'] = bdays_bool.groupby([df['date'].dt.year, df['date'].dt.month]).cumsum()

        date  nth_business_day
0 2020-03-29               0.0
1 2020-03-30               1.0
2 2020-03-31               2.0
3 2020-04-01               1.0
4 2020-04-02               2.0
5 2020-04-03               3.0
6 2020-04-04               3.0
7 2020-04-05               3.0
8 2020-04-06               4.0
9 2020-04-07               5.0
...