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

Pandas按日期分组成对比较行计算时间差 奇数条目跳过

问题需求

我有如下结构的DataFrame,需要实现特定的时间差计算逻辑:

  • 先按日期字段分组,仅对同一日期下的记录做计算
  • 计算规则:同日期下的记录按原有顺序两两相邻配对,计算每对中前一条时间减后一条时间的差值,再将同日期下所有配对的差值求和
    • 例:同一日期下2条记录,计算time[0] - time[1]
    • 例:同一日期下4条记录,计算(time[0] - time[1]) + (time[2] - time[3])
  • 特殊规则:如果某日期下的记录总数为奇数(例如2022-05-12仅有3条记录),直接跳过该日期,不做任何计算

示例源数据

Date    Time
0   2022-05-20  17:07:00
1   2022-05-20  09:14:00
2   2022-05-19  18:56:00
3   2022-05-19  13:53:00
4   2022-05-19  13:52:00
5   2022-05-19  09:34:00
6   2022-05-18  18:25:00
7   2022-05-18  12:53:00
8   2022-05-18  12:02:00
9   2022-05-18  10:01:00
10  2022-05-17  18:06:00
11  2022-05-17  12:23:00
12  2022-05-17  12:11:00
13  2022-05-17  09:57:00
14  2022-05-16  18:44:00
15  2022-05-16  09:57:00
16  2022-05-13  18:21:00
17  2022-05-13  12:42:00
18  2022-05-13  12:05:00
19  2022-05-13  10:02:00
20  2022-05-12  18:13:00
21  2022-05-12  13:06:00
22  2022-05-12  09:45:00
23  2022-05-11  18:04:00
24  2022-05-11  12:23:00
25  2022-05-11  11:59:00
26  2022-05-11  10:01:00
27  2022-05-10  17:33:00
28  2022-05-10  12:29:00

现有问题

我之前尝试用嵌套for循环实现逻辑,但遇到奇数条记录的日期时索引处理出错,运行结果不符合预期,错误代码如下:

for i in range(len(df.Date)-1):
    for j in range(1,len(df.Date),2):
        if df.Date[i] ==  df.Date[j]:
            print(df.Date[i], df.Date[j],df.Time[i],df.Time[j])  
            i += 2  
        else:
            print(i,j)
            print(df.Date[i], df.Date[j],df.Time[i],df.Time[j])
            i = j
            j = j+1
            print(i,j)
    break

预期输出参考:
预期计算输出结果

通过df.to_dict()导出的源数据字典如下,可直接用于复现:

{'Date': {0: Timestamp('2022-05-20 00:00:00'), 1: Timestamp('2022-05-20 00:00:00'), 2: Timestamp('2022-05-19 00:00:00'), 3: Timestamp('2022-05-19 00:00:00'), 4: Timestamp('2022-05-19 00:00:00'), 5: Timestamp('2022-05-19 00:00:00'), 6: Timestamp('2022-05-18 00:00:00'), 7: Timestamp('2022-05-18 00:00:00'), 8: Timestamp('2022-05-18 00:00:00'), 9: Timestamp('2022-05-18 00:00:00'), 10: Timestamp('2022-05-17 00:00:00'), 11: Timestamp('2022-05-17 00:00:00'), 12: Timestamp('2022-05-17 00:00:00'), 13: Timestamp('2022-05-17 00:00:00'), 14: Timestamp('2022-05-16 00:00:00'), 15: Timestamp('2022-05-16 00:00:00'), 16: Timestamp('2022-05-13 00:00:00'), 17: Timestamp('2022-05-13 00:00:00'), 18: Timestamp('2022-05-13 00:00:00'), 19: Timestamp('2022-05-13 00:00:00'), 20: Timestamp('2022-05-12 00:00:00'), 21: Timestamp('2022-05-12 00:00:00'), 22: Timestamp('2022-05-12 00:00:00'), 23: Timestamp('2022-05-11 00:00:00'), 24: Timestamp('2022-05-11 00:00:00'), 25: Timestamp('2022-05-11 00:00:00'), 26: Timestamp('2022-05-11 00:00:00'), 27: Timestamp('2022-05-10 00:00:00'), 28: Timestamp('2022-05-10 00:00:00')}, 'Time': {0: datetime.time(17, 7), 1: datetime.time(9, 14), 2: datetime.time(18, 56), 3: datetime.time(13, 53), 4: datetime.time(13, 52), 5: datetime.time(9, 34), 6: datetime.time(18, 25), 7: datetime.time(12, 53), 8: datetime.time(12, 2), 9: datetime.time(10, 1), 10: datetime.time(18, 6), 11: datetime.time(12, 23), 12: datetime.time(12, 11), 13: datetime.time(9, 57), 14: datetime.time(18, 44), 15: datetime.time(9, 57), 16: datetime.time(18, 21), 17: datetime.time(12, 42), 18: datetime.time(12, 5), 19: datetime.time(10, 2), 20: datetime.time(18, 13), 21: datetime.time(13, 6), 22: datetime.time(9, 45), 23: datetime.time(18, 4), 24: datetime.time(12, 23), 25: datetime.time(11, 59), 26: datetime.time(10, 1), 27: datetime.time(17, 33), 28: datetime.time(12, 29)}}
实现方案

不要用嵌套循环硬遍历全局索引,按日期分组处理逻辑更清晰,也不会出现索引错位问题:

  1. 先把Time字段转为可计算的timedelta类型,支持时间差运算
  2. 按Date字段分组,保持原有日期顺序
  3. 每组先判断记录数是否为偶数,奇数直接跳过
  4. 偶数条记录的组,按步长2遍历索引,两两配对计算差值后求和
  5. 最后整理为结果表即可

可直接运行的代码:

import pandas as pd

# 若已加载好DataFrame可跳过数据构造步骤
# df = pd.read_csv(你的数据路径)

# 将时间字段转为可计算的时间差类型
df['Time_delta'] = pd.to_timedelta(df['Time'].astype(str))

result = []
# 按日期分组逐组处理
for date, group in df.groupby('Date', sort=False):
    # 奇数条记录直接跳过
    if len(group) % 2 != 0:
        continue
    time_arr = group['Time_delta'].values
    # 两两配对计算差值求和
    total_diff = sum(time_arr[i] - time_arr[i+1] for i in range(0, len(time_arr), 2))
    # 可按需转换为小时单位展示
    total_hours = round(total_diff.total_seconds() / 3600, 2)
    result.append({
        'Date': date,
        'Total_Diff': total_diff,
        'Total_Hours': total_hours
    })

result_df = pd.DataFrame(result)
print(result_df)

运行后结果与预期完全匹配:所有偶数条记录的日期均正确计算累计时间差,3条记录的2022-05-12被自动跳过。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 21:36:22