Python中datetime.time对象按自定义规则求和的实现方案问询
解决带条件的时间调整求和问题
我明白你现在的困扰——datetime.time对象确实没法直接做算术运算,还要处理那些特殊的时间规则和讨厌的缺失值(NaN)。咱们换个思路,把所有时间转换成总分钟数来处理,这样加减、条件判断、求和都能轻松搞定!
完整解决方案代码
import pandas as pd # 读取Excel文件 df = pd.read_excel('test.xlsx') # 第一步:把Duration列的时间转成总分钟数,同时处理NaN值(转为0分钟) df['total_minutes'] = df['Duration'].apply(lambda x: (x.hour * 60 + x.minute) if pd.notna(x) else 0 ) # 第二步:定义时间调整规则函数 def adjust_minutes(minutes): eight_oclock = 8 * 60 # 8:00对应的总分钟数 eight_fifteen = eight_oclock + 15 # 8:15对应的总分钟数 nine_oclock = 9 * 60 # 9:00对应的总分钟数 if eight_oclock <= minutes < eight_fifteen: # 8:00-8:15之间,统一按8:00(480分钟)计算 return eight_oclock elif eight_fifteen <= minutes <= nine_oclock: # 8:15-9:00之间,时间减去15分钟 return minutes - 15 else: # 早于8:00或晚于9:00,保持原时间的总分钟数 return minutes # 第三步:应用调整规则到所有时间 df['adjusted_minutes'] = df['total_minutes'].apply(adjust_minutes) # 第四步:计算总时间并转成小时:分钟格式 total_adjusted = df['adjusted_minutes'].sum() total_hours = total_adjusted // 60 total_remaining_minutes = total_adjusted % 60 print(f"调整后的总时间:{total_hours}:{total_remaining_minutes:02d}")
代码解释
- 时间转总分钟数:把每个时间(比如8:13)转换成
8*60+13=493这样的整数,同时把NaN值转为0分钟(对应0:00),这样就避开了datetime.time对象不能运算的问题。 - 规则函数:完全按照你给定的三个条件来处理:
- 8:00到8:15之间的时间,直接返回480分钟(也就是标准的8:00)
- 8:15到9:00之间的时间,减去15分钟(比如8:30转成8:15)
- 其他时间段的时间保持原样(比如6:42、9:13都不做调整)
- 求和与格式转换:把所有调整后的分钟数求和,再转成
小时:分钟的友好格式输出,分钟数不足两位的会自动补0(比如5分钟会显示成05)。
针对你给出的示例列表验证
比如你提供的输入列表里:
8:13→ 转成493分钟,属于8:00-8:15区间,调整为480分钟8:15→ 转成495分钟,属于8:15-9:00区间,调整为495-15=480分钟8:16→ 转成496分钟,调整为496-15=481分钟9:13→ 转成553分钟,晚于9:00,保持553分钟NaN→ 直接转为0分钟
运行代码后就能得到符合要求的总时间啦!
内容的提问来源于stack exchange,提问作者Snaggyh
相关产品推荐
相关产品推荐

