Преобразуйте два столбца в 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