You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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就是你想要的结果:

DateNameDuration
01.01.23John Adams29:54
01.01.23Stacey Roland29:47

内容的提问来源于stack exchange,提问作者Superior_Lama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:20:22