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

如何基于日期范围合并Pandas DataFrame中的行

解决Pandas按3天时间段分组聚合的问题

我明白你想要按连续3天的时间段合并数据,拼接Name列并计算Cost的平均值,这里给你一套可行的解决方案:

首先,先确认我们的原始DataFrame格式是正确的(从你给出的数据来看,Name列每行是两个字符串,我们先构造出对应的DataFrame):

import pandas as pd

# 构造原始数据
data = {
    'date': ['2010-09-15', '2010-09-16', '2010-09-17', '2010-09-18', '2010-09-19', '2010-09-20'],
    'Name': ['ABC XYZ', 'PQR RTS', 'DEF GHI', 'LKJ POD', 'WER HDF', 'WFG MNB'],
    'Cost': [100, 30, 20, 80, 10, 30]
}
df = pd.DataFrame(data)

接下来分三步处理:

1. 将date列转换为datetime类型

这是日期分组的基础,确保Pandas能正确识别日期格式:

df['date'] = pd.to_datetime(df['date'])

2. 创建3天时间段的分组键

我们可以通过计算每个日期与最早日期的天数差,再整除3来生成分组标签,这样就能把连续3天归为一组:

# 计算分组标签:0代表第一组(前3天),1代表第二组(接下来3天)
df['group'] = (df['date'] - df['date'].min()).dt.days // 3

如果你更喜欢用Pandas内置的分组工具,也可以用pd.Grouper实现,指定频率为3天同时设置起始日期为数据中的最早日期,避免默认起始规则打乱你的分组逻辑:

# 另一种分组方式:使用Grouper
grouped = df.groupby(pd.Grouper(key='date', freq='3D', origin=df['date'].min()))

3. 分组聚合

对每个分组执行拼接Name和计算Cost平均值的操作:

# 用第一种分组标签的方式聚合
result = df.groupby('group').agg(
    date=('date', 'first'),  # 取每组的第一个日期作为合并后的日期
    Name=('Name', ' '.join),  # 拼接分组内所有Name字符串
    Cost=('Cost', 'mean')     # 计算分组内Cost的平均值
).reset_index(drop=True)

# 如果用Grouper的方式,代码如下:
# result = grouped.agg(
#     date=('date', 'first'),
#     Name=('Name', ' '.join),
#     Cost=('Cost', 'mean')
# ).reset_index(drop=True)

执行完后,result就是你想要的结果:

date                                      Name  Cost
0 2010-09-15  ABC XYZ PQR RTS DEF GHI  50.0
1 2010-09-18  LKJ POD WER HDF WFG MNB  40.0

关键说明:

  • 用(df['date'] - df['date'].min()).dt.days // 3的好处是严格从数据的第一天开始按3天分组,不会因为日期不连续而打乱分组逻辑;
  • pd.Grouper的origin参数用来指定分组的起始点,避免默认的起始规则(比如从周一开始)导致分组不符合你的预期;
  • 聚合时用'first'取每组的第一个日期作为合并后的date值,和你想要的结果完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:02:27