[英]How to sum timedeltas with resample or groupby in Pandas?
我有一个带有 TIME_IN 和 TIME_OUT 列的 DataFrame(日期时间到秒)。 我想要一个新的 DF,其中包含按日期计算的持续时间总和(TIME_OUT - TIME_IN)。 每天从早上 5 点到凌晨 5 点运行,所以我也对此进行了调整。
这是自学 Pandas 的小型项目的一部分,但我的下一个应用程序将涉及更多,因此效率对我来说是关键。
我尝试了两种方法(resample 和 groupby),但都有相同的问题:timedelta DURATION 列没有求和。
df["DATE"] = pd.to_datetime((df["TIME_IN"]
- dt.timedelta(hours=hrEnd)).dt.date)
df["DURATION"] = df["TIME_OUT"] - df["TIME_IN"]
dfGroupBy= df.groupby("DATE").sum()
df.setindex("DATE", inplace=True)
dfResample = df.resample("D").sum()
似乎 Pandas 没有像我尝试的那样对 timedelta64 类型的列求和,所以返回的 DataFrame 根本不包括 DURATION 列。 最有效的方法是什么?
您可以使用分组 object 的agg
function 来计算持续时间,如下所示
import pandas as pd
import numpy as np
np.random.seed(10)
## Generate dummy data for testing
dt_range = pd.date_range("oct-12-2019", "oct-14-2019", freq="H")
arr = []
while len(arr)<10:
i,j = np.random.choice(len(dt_range), 2)
g = np.random.choice(4)
if j>i:
arr.append([g, dt_range[i], dt_range[j]])
df = pd.DataFrame(arr, columns=["group", "time_in", "time_out"])
## Solution
df["duration"] = df["time_out"] - df["time_in"]
df.groupby(df["time_in"].dt.date).agg({"duration":np.sum})
我认为您的代码按预期工作?
df['TIME_IN'] = pd.to_datetime(df['TIME_IN'])
df['TIME_OUT'] = pd.to_datetime(df['TIME_OUT'])
df['DATE'] = (df['TIME_IN'] - datetime.timedelta(hours=5)).dt.date
df["DURATION"] = df["TIME_OUT"] - df["TIME_IN"]
df.groupby("DATE")['DURATION'].sum()
输入到 groupby
TIME_IN TIME_OUT DATE DURATION
0 2019-05-06 11:46:51 2019-05-06 11:50:36 2019-05-06 00:03:45
1 2019-05-02 20:47:54 2019-05-02 20:52:22 2019-05-02 00:04:28
2 2019-05-05 07:39:02 2019-05-05 07:46:34 2019-05-05 00:07:32
3 2019-05-04 17:28:52 2019-05-04 17:32:57 2019-05-04 00:04:05
4 2019-05-05 14:08:26 2019-05-05 14:14:30 2019-05-05 00:06:04
分组后的 Output
DATE
2019-05-02 00:04:28
2019-05-04 00:04:05
2019-05-05 00:13:36
2019-05-06 00:03:45
似乎按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.