首页 > 解决方案 > DataFrame - 给定开始日期、结束日期、每天产生的小时数,我如何计算给定月/年产生的小时数?

问题描述

我有一个由employee_id、start_date、end_date、hour_spent_per_day 组成的数据框。基本上对于每条记录,它都会记录员工每天花费的时间以及由 start_Date 和 end_Date 给出的持续时间。

员工ID 开始日期 结束日期 hours_spent_per_day
1234 2019-01-15 2019-01-15 2
1234 2019-01-15 2019-01-17 3
1236 2019-01-29 2019-02-28 4
1237 2019-01-19 2019-03-05 2
1237 2019-12-01 2020-01-10 2

我的目标是总结每年每月花费的总小时数。IE

花费的时间
2019 一月 '所有员工在 2019 年 1 月的所有日子里花费的小时数
2019 二月 '所有员工在 2019 年 2 月的所有日子里花费的小时数
2019 行进 '所有员工在 2019 年 3 月的所有日子里花费的小时数
2019 十二月 '所有员工在 2019 年 12 月的所有日子里花费的时间
2020 一月 '所有员工在 2020 年 1 月的所有日子里花费的时间

现在第二个表很容易(只是按 SQL 分组的问题)。但是我对第一个表有问题,即对于每一行,我如何确定每个月花费的时间(注意跨月是可能的)。我想我需要确定每一行所涵盖的确切月份/年份,然后乘以该月花费的时间。我被困住了,寻求您的帮助。

标签: pythondataframe

解决方案


尝试:

df["start_Date"] = pd.to_datetime(df["start_Date"])
df["end_Date"] = pd.to_datetime(df["end_Date"])

df["tmp"] = df.apply(
    lambda x: pd.date_range(x["start_Date"], x["end_Date"]), axis=1
)
df = df.explode("tmp")

x = df.groupby([df.tmp.dt.year, df.tmp.dt.month_name()])[
    "hours_spent_per_day"
].sum()

x.index = x.index.rename(["Year", "Month"])
print(x.reset_index().rename(columns={"hours_spent_per_day": "Hours Spent"}))

印刷:

   Year     Month  Hours Spent
0  2019  December           62
1  2019  February          168
2  2019   January           49
3  2019     March           10
4  2020   January           20

推荐阅读