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

Pandas处理DataFrame:合并重复行与计算时间差需求

DataFrame数据合并与时间差计算解决方案

完整代码实现

import pandas as pd
from datetime import datetime

# 构建原始DataFrame(对应提供的原始数据)
data = {
    'Date': ['2023-09-28 10:30', '2023-09-28 11:00', '2023-09-28 11:30', '2023-09-28 12:00',
             '2023-09-28 12:30', '2023-09-28 13:00', '2023-09-28 13:30', '2023-09-28 14:00',
             '2023-09-28 14:30', '2023-09-28 15:00', '2023-09-28 13:30', '2023-09-28 16:00',
             '2023-09-28 14:30', '2023-09-28 16:00', '2023-09-28 16:30'],
    'price': [5,7,3,4,2,7,5,7,5,7,5,1,6,1,5],
    'client': [5,7,1,3,8,4,6,4,6,4,6,3,1,3,6],
    'Count': [3,9,10,15,1,8,9,8,9,8,9,12,11,12,9],
    'test': ['0','L','GG','GG','L','GG','GG','GG','GG','GG','GG','L','L','L','GG'],
    'flag': ['','','X','A','','X','X','X','X','X','A','X','X','A','']
}

df = pd.DataFrame(data)

# 合并X标记行到对应A标记行
# 计算每个test分组下X行的client和Count总和
x_group_sum = df[df['flag'] == 'X'].groupby('test')[['client', 'Count']].sum().reset_index()

# 筛选出非X行(包含A标记行和无标记行)
df_filtered = df[df['flag'] != 'X'].copy()

# 将X行的总和合并到对应test分组的A行
df_filtered = df_filtered.merge(x_group_sum, on='test', how='left', suffixes=('', '_x_sum'))
df_filtered['client'] = df_filtered.apply(
    lambda row: row['client'] + (row['client_x_sum'] if row['flag'] == 'A' else 0), axis=1
)
df_filtered['Count'] = df_filtered.apply(
    lambda row: row['Count'] + (row['Count_x_sum'] if row['flag'] == 'A' else 0), axis=1
)
df_filtered.drop(['client_x_sum', 'Count_x_sum'], axis=1, inplace=True)

# 计算时间差并生成time列
# 转换Date列为datetime类型
df_filtered['Date'] = pd.to_datetime(df_filtered['Date'])
# 按时间顺序排序
df_filtered = df_filtered.sort_values('Date').reset_index(drop=True)

# 计算当前行到下一行的时间差(分钟)
df_filtered['time_diff'] = df_filtered['Date'].shift(-1) - df_filtered['Date']
df_filtered['time_diff_min'] = df_filtered['time_diff'].dt.total_seconds() / 60

# 格式化时间差为要求的格式
df_filtered['time'] = df_filtered['time_diff_min'].apply(
    lambda x: '30minut' if x == 30 else '1H' if x == 60 else ''
)

# 整理成期望的输出格式
result = df_filtered[['Date', 'price', 'client', 'Count', 'test', 'time']]
result['Date'] = result['Date'].dt.strftime('%Y-%m-%d %H:%M')

# 打印结果
print(result.to_string(index=False))

步骤说明

1. 合并X行到A行

  • 按test分组,计算所有X标记行的client和Count总和
  • 筛选出非X行,将分组求和结果合并到对应test分组的A标记行,对client和Count进行累加
  • 删除临时计算列,得到合并后的基础数据集

2. 时间差计算与格式化

  • 将Date列转换为datetime类型,确保时间计算准确
  • 按时间顺序排序数据集(原始数据存在时间乱序情况)
  • 计算当前行到下一行的时间差,转换为分钟单位
  • 将30分钟格式化为30minut,60分钟格式化为1H,生成time列
  • 整理列顺序并格式化Date为字符串,得到最终结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:20:00