如何用Python计算日期范围内跨时段进程每小时的运行分钟数
Python实现进程小时级运行分钟数统计
实现思路
- 先将输入的起止时间转换为
datetime类型,便于时间计算 - 定位进程开始时间所在小时的下一个整点作为第一个统计区间的结束时间(即
end_hour的第一个取值) - 循环遍历所有被进程运行时间覆盖的小时区间,每个区间取进程实际运行的交集部分,换算为分钟数存储
- 批量处理数据表时可结合pandas的行遍历与展开功能实现批量计算
完整代码实现
单进程计算函数
import datetime from typing import List, Tuple def calculate_hourly_running_minutes( start_time: datetime.datetime, end_time: datetime.datetime ) -> List[Tuple[datetime.datetime, int]]: # 边界处理:开始时间大于等于结束时间直接返回空 if start_time >= end_time: return [] result = [] # 第一个统计区间的结束时间:开始时间所在小时的下一个整点 current_hour_end = start_time.replace(minute=0, second=0, microsecond=0) + datetime.timedelta(hours=1) while current_hour_end - datetime.timedelta(hours=1) < end_time: # 计算当前小时区间内进程实际运行的起止时间 period_start = max(start_time, current_hour_end - datetime.timedelta(hours=1)) period_end = min(end_time, current_hour_end) # 换算为分钟数,忽略秒数可改为 total_seconds() // 60 running_minutes = round((period_end - period_start).total_seconds() / 60) result.append((current_hour_end, running_minutes)) # 移动到下一个小时区间 current_hour_end += datetime.timedelta(hours=1) return result
批量处理Pandas数据表
如果你的原始数据存储在Pandas DataFrame中,可按以下方式批量处理:
import pandas as pd # 假设原始数据表为df,包含start_time、end_time两列,先转换为datetime类型 df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time']) # 逐行计算小时级分钟数 df['hourly_data'] = df.apply( lambda row: calculate_hourly_running_minutes(row['start_time'], row['end_time']), axis=1 ) # 展开嵌套的计算结果 df = df.explode('hourly_data', ignore_index=True) df[['end_hour', 'total_minutes']] = pd.DataFrame(df['hourly_data'].tolist(), index=df.index) # 清理冗余列,若需要统计所有进程每小时总运行分钟数,可新增groupby步骤 df = df.drop(columns=['start_time', 'end_time', 'hourly_data']) # 可选:按end_hour聚合得到所有进程每小时总运行分钟数 # total_df = df.groupby('end_hour')['total_minutes'].sum().reset_index()
测试验证
你可以用给出的示例直接测试函数正确性:
# 示例1 start1 = datetime.datetime(2019,7,1,11,25) end1 = datetime.datetime(2019,7,1,11,40) print(calculate_hourly_running_minutes(start1, end1)) # 输出:[(datetime.datetime(2019, 7, 1, 12, 0), 15)] # 示例2 start2 = datetime.datetime(2019,7,1,21,40) end2 = datetime.datetime(2019,7,1,22,10) print(calculate_hourly_running_minutes(start2, end2)) # 输出:[(datetime.datetime(2019, 7, 1, 22, 0), 20), (datetime.datetime(2019, 7, 1, 23, 0), 10)]
内容的提问来源于stack exchange,提问作者BarkingCat
相关产品推荐
相关产品推荐

