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

如何对DataFrame指定列求和并正确处理datetime日期列?

按人员汇总DataFrame并合并日期区间的解决方案

原数据与需求

原DataFrame(日期列已转为datetime类型)

import pandas as pd

data = {
    'Name': ['John', 'Betty', 'Bruce', 'John', 'Betty'],
    'Amount': [11, 13, 17, 19, 27],
    'Start_date': pd.to_datetime(['01/01/2022', '01/01/2022', '01/01/2022', '02/01/2022', '04/17/2022']),
    'End_date': pd.to_datetime(['01/02/2022', '04/16/2022', '05/17/2022', '03/19/2022', '06/30/2022']),
    'Country': ['USA', 'China', 'Germany', 'USA', 'China']
}
df = pd.DataFrame(data)

需求

  • 按人员汇总Amount列的数值
  • 合并日期区间:新的Start_date为该人员最早的起始日,End_date为最晚的结束日(题目说明区间无间隔,旧结束日次日即为新起始日)
  • 原样保留Country列(同一人员的Country值一致)

解决方案

直接使用groupby结合agg方法,一次性完成所有聚合操作,不会破坏原DataFrame:

# 分组聚合
result_df = df.groupby('Name').agg(
    Amount=('Amount', 'sum'),
    Start_date=('Start_date', 'min'),
    End_date=('End_date', 'max'),
    Country=('Country', 'first')
).reset_index()

# 可选:将日期格式化为MM/DD/YYYY(与原数据显示一致)
result_df['Start_date'] = result_df['Start_date'].dt.strftime('%m/%d/%Y')
result_df['End_date'] = result_df['End_date'].dt.strftime('%m/%d/%Y')

print(result_df)

代码说明

  • groupby('Name'):按人员姓名分组
  • agg():为每列指定聚合逻辑:
    • Amount:用sum汇总该人员的所有金额
    • Start_date:用min取该人员最早的起始日期
    • End_date:用max取该人员最晚的结束日期(因区间无间隔,直接取首尾即可覆盖完整周期)
    • Country:用first取该组第一条数据的Country值(同一人员Country一致,取任意值均可)
  • reset_index():将分组的Name从索引转换为普通列,还原成常规DataFrame结构

输出结果

Name  Amount Start_date   End_date  Country
0  Betty      40  01/01/2022  06/30/2022    China
1  Bruce      17  01/01/2022  05/17/2022  Germany
2   John      30  01/01/2022  03/19/2022      USA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:30:46