Панды читают дату из CSV и в группе по общим рабочим дням в месяце - PullRequest
1 голос
/ 11 октября 2019

data.CSV

ID Activity Month   Activity Date

0   04/2019     04-01-2019

1   05/2019     05-13-2019

2   05/2019     05-25-2019

3   06/2019     06-10-2019

4   06/2019     06-19-2019

5   07/2019     07-15-2019

6   07/2019     07-18-2019

7   07/2019     07-29-2019

8   08/2019     06-03-2019

9   08/2019     06-15-2019

10  08/2019     06-20-2019

МОЙ ПЛАН

Считать CSV:

df = pd.read_csv ('data.CSV')

Конвертировать в datetime:

df ['Дата активности'] = pd.to_datetime (df ['Дата активности'], dayfirst = True)

Сгруппировать по столбцу Месяц активности:

grouped = df.groupby (['Месяц активности']) ['Дата активности']. count()

печать (сгруппированная)

Activity Month
04/2019    15532
05/2019    13924
06/2019    12822
07/2019    14067
08/2019    10939
Name: Activity Date, dtype: int64

Пока дата сгруппирована, выполните расчет рабочего дня:

Эта часть неконечно, что делать. Уже потерян

КОД, который Я ИСПОЛЬЗУЛ ДЛЯ РАСЧЕТА БИЗНЕС-ДНЕЙ

import calendar
import datetime

x = datetime.date(2019, 4, 1)
cal = calendar.Calendar()
working_days = len([x for x in cal.itermonthdays2(x.year, x.month) if x[0] !=0 and x[1] < 5])
print ("Total business days for month (" + str(x.month) +  ") is " + str(working_days) + " days")

ВЫХОД, КОТОРЫЙ Я ХОТЕЛ

Total business days for month (4) is 22 days
Total business days for month (5) is 23 days
Total business days for month (6) is 20 days
Total business days for month (7) is 23 days
Total business days for month (8) is 22 days

1 Ответ

1 голос
/ 11 октября 2019

Мне не совсем понятна и формулировка проблемы здесь, но если вы хотите рассчитать количество рабочих дней для каждого Activity Month, вы можете обернуть ваши расчеты в метод и применить этот метод к вашему Activity Monthстолбец (выражение lambda в основном является циклической операцией для каждой строки для указанных столбцов).

grouped = df.groupby(['Activity Month'])['Activity Date'].count().reset_index()

def get_business_days(x):
    x = datetime.date(int(x.split('/')[1]), int(x.split('/')[0]), 1)
    cal = calendar.Calendar()
    working_days = len([x for x in cal.itermonthdays2(x.year, x.month) if x[0] !=0 and x[1] < 5])
    return ("Total business days for month (" + str(x.month) +  ") is " + str(working_days) + " days")

grouped['Activity Month'].apply(get_business_days)

Выходные данные - это серия, в которой есть текстовый вывод.

0    Total business days for month (4) is 22 days
1    Total business days for month (5) is 23 days
2    Total business days for month (6) is 20 days
3    Total business days for month (7) is 23 days
4    Total business days for month (8) is 22 days

Но хранить повторную информацию в каждой ячейке - плохая идея. Было бы предпочтительнее просто вернуть working_days вместо того, чтобы встроить его в строку.

...