如何计算重叠线性折线的累计和并生成对应pandas dataframe
实现思路
- 第一步:提取所有时间节点:将原数据中
Start time和End time列的所有值去重后从小到大排序,得到所有x轴采样点。 - 第二步:计算单条折线的单位时间变化率:对每一行数据计算斜率
k = Value/(End time - Start time),代表该折线在对应时间段内每单位时间的增量。 - 第三步:逐段累计总增量:遍历相邻的两个采样点,统计所有覆盖当前时间段的折线的斜率总和,乘以时间差得到该段的总增量,累加到全局总和中,记录每个采样点对应的累计值即可。
完整代码实现
import pandas as pd # 构造输入数据 df = pd.DataFrame({ 'Start time': [0, 20, 10], 'End time': [50, 100, 45], 'Value': [50, 800, 700] }) # 1. 提取所有时间节点并排序 all_times = sorted(pd.concat([df['Start time'], df['End time']]).unique()) # 2. 提前计算每条折线的单位时间增量(斜率) df['k'] = df['Value'] / (df['End time'] - df['Start time']) result_list = [] total_value = 0 # 遍历每一段相邻时间区间计算增量 for i in range(len(all_times)-1): t_left = all_times[i] t_right = all_times[i+1] # 筛选所有覆盖当前时间段的折线 active_line_mask = (df['Start time'] <= t_left) & (df['End time'] >= t_right) # 计算当前时间段总斜率 sum_k = df.loc[active_line_mask, 'k'].sum() # 累加增量 total_value += sum_k * (t_right - t_left) result_list.append({'x': t_right, 'value': total_value}) # 补充x=0的初始值 result_list = [{'x': all_times[0], 'value': 0}] + result_list result_df = pd.DataFrame(result_list) # 可按需转换为整数类型 result_df['value'] = result_df['value'].astype(int) print(result_df)
输出结果验证
| x | value |
|---|---|
| 0 | 0 |
| 10 | 10 |
| 20 | 220 |
| 45 | 995 |
| 50 | 1050 |
| 100 | 1550 |
内容的提问来源于stack exchange,提问作者Jing Luis Cao
相关产品推荐
相关产品推荐

