Pandas如何根据时长列条件按固定时段拆分生成DataFrame新行
实现方法
按每日8小时工时拆分时长生成新行的完整实现逻辑如下,兼容总时长大于1440分钟的场景:
核心思路
- 先将字符串格式的时间列转换为pandas可计算的datetime类型,注意原始时间为
日-月-年格式,解析时需指定日期优先 - 单天有效工时为480分钟(8小时*60分钟),用总时长除以单天工时向上取整,得到每条记录需要拆分的天数
- 按拆分天数逐天生成对应日期的9:00-17:00时段记录,最后格式化输出为要求的时间字符串格式
完整代码
import pandas as pd import numpy as np # 原始DataFrame data = {'startTime':['01-06-2010 09:00:00', '13-02-2016 09:00:00', '18-03-2018 09:00:00', '23-05-2011 09:00:00'], 'endTime':['02-06-2010 17:00:00', '14-02-2016 17:00:00', '19-03-2018 17:00:00', '24-05-2011 17:00:00'], 'durationInMinutes': [1440, 1440, 1440, 1440]} df = pd.DataFrame(data) # 1. 转换时间列为datetime类型,指定dayfirst=True适配日-月-年格式 df['startTime'] = pd.to_datetime(df['startTime'], dayfirst=True) daily_work_min = 8 * 60 # 每日有效工时480分钟 # 2. 计算每条记录需要拆分的天数 df['split_days'] = (df['durationInMinutes'] / daily_work_min).apply(np.ceil).astype(int) # 3. 按拆分天数展开行 df = df.assign( day_offset=df['split_days'].apply(lambda x: list(range(x))) ).explode('day_offset', ignore_index=True) # 4. 生成拆分后的startTime、endTime df['startTime'] = df.apply( lambda row: row['startTime'].normalize() + pd.Timedelta(days=row['day_offset'], hours=9), axis=1 ) df['endTime'] = df['startTime'] + pd.Timedelta(hours=8) # 5. 清理多余列,格式化为要求的字符串时间格式 df = df.drop(columns=['durationInMinutes', 'split_days', 'day_offset']) df['startTime'] = df['startTime'].dt.strftime('%d-%m-%Y %H:%M:%S') df['endTime'] = df['endTime'].dt.strftime('%d-%m-%Y %H:%M:%S')
输出验证
运行上述代码后输出结果和预期完全一致,前6行结果如下:
startTime endTime 0 01-06-2010 09:00:00 01-06-2010 17:00:00 1 02-06-2010 09:00:00 02-06-2010 17:00:00 2 03-06-2010 09:00:00 03-06-2010 17:00:00 3 13-02-2016 09:00:00 13-02-2016 17:00:00 4 14-02-2016 09:00:00 14-02-2016 17:00:00 5 15-02-2016 09:00:00 15-02-2016 17:00:00
适配说明
- 如果总时长不是480的整数倍,代码会自动向上取整生成对应天数的完整时段,若需要最后一天按时长截断endTime,可在生成endTime步骤增加时长判断逻辑
- 拆分逻辑完全以
durationInMinutes字段为准,不受原始endTime字段限制,和示例逻辑匹配
内容的提问来源于stack exchange,提问作者elnino
相关产品推荐
相关产品推荐

