首页 > 解决方案 > 使用熊猫显示员工开始和结束日期每年工作的月数?

问题描述

我有员工的开始和结束日期,我想显示使用 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 

标签: pythonpandasdatetime

解决方案


将两列转换为日期时间:

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)

获取每年和每个 ID 的月数:

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

推荐阅读