Как суммировать timedeltas с повторной выборкой или сгруппировать в Pandas? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть DataFrame со столбцами TIME_IN и TIME_OUT (datetime с точностью до секунды). Я хочу новый DF с суммой продолжительности (TIME_OUT - TIME_IN) по дате. Каждый день длится с 5 утра до 5 утра, поэтому я тоже подстраиваюсь под него.

Это часть мини-проекта по обучению себе Панд, но мое следующее приложение будет гораздо более сложным, поэтому ЭФФЕКТИВНОСТЬ - это ключ к успеху. меня.

Я пробовал два подхода (ресэмпл и групповой), но оба имеют одну и ту же проблему: столбец 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()

Кажется, Панды не суммируютСтолбцы типа timedelta64, как я и пытался, поэтому возвращаемый DataFrame просто не включает столбец DURATION. Какой самый эффективный способ сделать это?

РЕДАКТИРОВАТЬ: Вот пример необработанных данных прямо в df: enter image description here

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Я думаю, что ваш код работает должным образом?

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

Выход после groupby

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

Кажется, работает как ожидалось.

0 голосов
/ 12 октября 2019

Вы можете использовать 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})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...