python - 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 分组的问题)。但是我对第一个表有问题,即对于每一行,我如何确定每个月花费的时间(注意跨月是可能的)。我想我需要确定每一行所涵盖的确切月份/年份,然后乘以该月花费的时间。我被困住了,寻求您的帮助。
解决方案
尝试:
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
推荐阅读
- android - 为什么我的 Android 应用无法识别 drawables 目录的子目录中的 PNG?
- read-the-docs - ReadTheDocs 说“无法添加 webhook”
- java - 想把CFScript源代码转换成Java源代码
- amazon-web-services - AWS EventBridge putEvents 不接受详细 JSON 数组
- javascript - 自定义选择下拉列表中的 onchange 不起作用
- firebase - 使用 Firebase 托管,我可以将所有路由设置为具有相同的目的地,同时还具有 api 路由吗?
- react-native - 无法在 Expo for Firebase Analytics 上运行 setDebugModeEnabled
- c - Codelite Clang 错误:没有这样的文件或目录 @./build-Debug
- angular - Angular 10:有条件地渲染 fontAwesome 图标
- python - 库存物品的网页抓取