如何基于日期范围合并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
相关产品推荐
相关产品推荐

