如何在Pandas DataFrame中按日期和姓名汇总时长列?
解决方法
你之前的问题主要有两个点没处理对:
- 只按
Date分组,没把Name也作为分组依据,没法区分同一天里不同用户的记录 Duration是字符串格式的时分数据,直接调用sum()无法正确计算时间总和,得先转成Pandas能识别的时间增量类型
下面是具体实现步骤:
1. 将Duration转为可计算的时间类型
用pd.to_timedelta把字符串格式的时分转成时间差:
df['Duration'] = pd.to_timedelta(df['Duration'])
2. 按Date+Name分组求和
同时指定两个分组键,对转换后的Duration列求和,as_index=False能让Date和Name保持为普通列,不会变成索引:
grouped_df = df.groupby(['Date', 'Name'], as_index=False)['Duration'].sum()
3. 把求和结果转回时分格式
将总时长转换成"HH:MM"的字符串格式:
grouped_df['Duration'] = grouped_df['Duration'].apply(lambda x: f"{x.components.hours:02d}:{x.components.minutes:02d}")
4. 可选:只保留有重复的分组(匹配预期结果)
如果只想展示像预期里那样有重复记录的分组,再加一步过滤:
# 先统计每个分组的记录数 count_df = df.groupby(['Date', 'Name']).size().reset_index(name='Count') # 只保留记录数大于1的分组 filtered_df = grouped_df.merge(count_df[count_df['Count']>1], on=['Date', 'Name']).drop('Count', axis=1)
完整代码示例
import pandas as pd # 构造原始数据 data = { 'Date': ['01.01.23', '01.01.23', '01.01.23', '01.04.23', '01.05.23'], 'Name': ['John Adams', 'John Adams', 'Stacey Roland', 'Ron Swanson', 'Jan Wood'], 'Duration': ['14:52', '15:02', '29:47', '30:22', '28:48'] } df = pd.DataFrame(data) # 转换Duration类型 df['Duration'] = pd.to_timedelta(df['Duration']) # 分组求和 grouped_df = df.groupby(['Date', 'Name'], as_index=False)['Duration'].sum() # 转回时分格式 grouped_df['Duration'] = grouped_df['Duration'].apply(lambda x: f"{x.components.hours:02d}:{x.components.minutes:02d}") # 过滤仅保留有重复的分组 count_df = df.groupby(['Date', 'Name']).size().reset_index(name='Count') filtered_df = grouped_df.merge(count_df[count_df['Count']>1], on=['Date', 'Name']).drop('Count', axis=1) print(filtered_df)
运行后filtered_df就是你想要的结果:
| Date | Name | Duration |
|---|---|---|
| 01.01.23 | John Adams | 29:54 |
| 01.01.23 | Stacey Roland | 29:47 |
内容的提问来源于stack exchange,提问作者Superior_Lama
相关产品推荐
相关产品推荐

