为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Pandas 中将 timedeltas 与 resample 或 groupby 相加?

如何在 Pandas 中将 timedeltas 与 resample 或 groupby 相加?

元芳怎么了 2022-06-22 17:05:26
我有一个带有 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 列。最有效的方法是什么?
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超4个赞

我认为您的代码按预期工作?


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

分组后输出


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

似乎按预期工作。


查看完整回答
反对 回复 2022-06-22
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以使用agg分组对象的功能来总结持续时间,如下所示


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})


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号