Покажите количество отработанных месяцев в году с датами начала и окончания работника, используя pandas? - PullRequest
1 голос
/ 20 июня 2020

У меня есть даты начала и окончания работника, и я хочу показать количество отработанных месяцев в году, используя pandas.

ID | Start Date| End Date \
1  | 1\2016  | 3\2018  \
2  | 2\2017  | 4\2019 \
3  | 4\2019  | 3\2020 

общую таблицу, которую я ищу:

ID | Year | Months Worked \
1  | 2016 | 12 \
1  | 2017 | 12 \
1 | 2018  | 3\
2  | 2017 | 11 \
2  | 2018 | 12 \
2 | 2019  | 4\
3  | 2019 | 9 \
3  | 2020 | 3 

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Преобразуйте два столбца в datetime:

df["Start Date"] = pd.to_datetime(df["Start Date"])
df["End Date"] = pd.to_datetime(df['End Date'])+ MonthEnd(1)
df.set_index("ID", inplace=True)

Получите количество месяцев в году и для каждого идентификатора:

test = df.apply(lambda x: Counter(pd.date_range(x["Start Date"], x["End Date"], freq="M").strftime('%Y')), axis=1)

print(test)
ID
1    {'2016': 12, '2017': 12, '2018': 3}
2    {'2017': 11, '2018': 12, '2019': 4}
3                 {'2019': 9, '2020': 3}

Преобразуйте серию в dataframe и получите окончательный таблица:

final_df = pd.DataFrame(list(test), index=df.index)
final_df["ID"]= final_df.index
pd.melt(final_df, id_vars="ID").dropna().sort_values("ID").reset_index(drop=True)

Вывод:

ID  variable    value
0   1   2016    12.0
1   1   2017    12.0
2   1   2018    3.0
3   2   2017    11.0
4   2   2018    12.0
5   2   2019    4.0
6   3   2019    9.0
7   3   2020    3.0
0 голосов
/ 20 июня 2020

Сначала преобразуйте дату и время в соответствующий объект datetime.

затем мы переделаем ваш фрейм данных на дневной уровень, используя некоторое изменение формы.

затем применим groupby для подсчета уникальных месяцев по год.

df['Start Date'] = pd.to_datetime(df['Start Date'],format='%m\\%Y')
df['End Date']   = pd.to_datetime(df['End Date'],format='%m\\%Y')

s = df.set_index('ID').stack().reset_index(name='date range')\
   .set_index('date range')\
   .groupby('ID',as_index=False).resample('M').ffill()\
   .reset_index(1)


final = s.assign(month=s['date range'].dt.month)\
         .groupby([s['date range'].dt.year,'ID'])['month'].nunique()\
         .reset_index(name='months worked')
print(final)

date range  ID   months worked
2016        1     12
2017        1     12
            2     11
2018        1      3
            2     12
2019        2      4
            3      9
2020        3      3
Name: month, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...