0

I want to sum the value of each gender for every 5 min timestamp.

Main Table:-

Time   Gender  value

10:01  Male      5
10:02  Female    1
10:03  Male      5
10:04  Male      5
10:05  Female    1
10:06  Female    1
10:07  Male      5
10:08  Male      5
10:09  Male      5
10:10  Male      5

Required Result:-

Time   Gender  value
10:00  Male     15
10:00  Female   2
10:05  Male     20
10:05  Female   1
mozway
  • 194,879
  • 13
  • 39
  • 75

1 Answers1

0

You could convert to TimeDelta, floor the result, and use it to groupby+agg:

t = pd.to_timedelta(df['Time']+':00')
(df
 .groupby([t.dt.floor('5min'), 'Gender']) 
 .agg({'value': 'sum'})
 .reset_index()
)

output:

             Time  Gender  value
0 0 days 10:00:00  Female      1
1 0 days 10:00:00    Male     15
2 0 days 10:05:00  Female      2
3 0 days 10:05:00    Male     15
4 0 days 10:10:00    Male      5
matching the provided output

To match your provided output, it needs a few more things.

  • subtracting one minute to floor '00:05:00' on '00:00:00'
  • converting back to string
t = pd.to_timedelta(df['Time']+':00').sub(pd.to_timedelta('1min'))

(df
 .groupby([t.dt.floor('5min'), 'Gender']) 
 .agg({'value': 'sum'})
 .reset_index()
 .assign(Time=lambda d: (pd.to_datetime(0)+d['Time']).dt.strftime('%H:%M'))
)

output:

    Time  Gender  value
0  10:00  Female      2
1  10:00    Male     15
2  10:05  Female      1
3  10:05    Male     20
variant
t = pd.to_timedelta(df['Time']+':00').sub(pd.to_timedelta('1min'))
(df.assign(Time=t.dt.floor('5min').astype(str).str[-8:-3])
   .groupby(['Time', 'Gender'])
   ['value'].sum().reset_index()
)
mozway
  • 194,879
  • 13
  • 39
  • 75
  • 1
    Can you update your post with this alternative? `df.assign(Time=pd.to_timedelta(df['Time'] + ':00').dt.floor('5min').astype(str).str[-8:-3]).groupby(['Time', 'Gender'])['value'].sum().reset_index()` – Corralien Jan 05 '22 at 14:55
  • 2
    Probably a DV because OP does not show some effort to solve his problem. As usual :( +1 for the answer – Corralien Jan 05 '22 at 14:57
  • Can anyone help me on this? https://stackoverflow.com/q/71161977/17841241 – ManishEnfielder Feb 20 '22 at 04:29