基于分组内各进程起止时间的Pandas DataFrame重采样问题
解决方案:按分组和进程对时间范围进行1分钟频率重采样
核心思路
直接用resample无法满足需求,因为原数据没有现成的时间序列,只有每个进程的起止时间。正确做法是:对每个(Group, Process)分组,根据其StartTime和EndTime生成1分钟间隔的时间戳序列,再将所有分组的结果合并成最终DataFrame。
步骤实现
1. 准备数据并转换时间格式
首先确保时间列是datetime类型,否则无法生成时间序列:
import pandas as pd # 示例输入数据 data = { 'Group': ['A', 'A', 'B'], 'Process': ['P1', 'P2', 'P1'], 'StartTime': ['2024-05-20 08:15:00', '2024-05-20 09:00:00', '2024-05-20 10:30:00'], 'EndTime': ['2024-05-20 08:18:30', '2024-05-20 09:02:15', '2024-05-20 10:31:45'] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df['StartTime'] = pd.to_datetime(df['StartTime']) df['EndTime'] = pd.to_datetime(df['EndTime'])
2. 定义生成时间序列的函数
这个函数负责处理单个分组,生成该进程在起止时间内的1分钟间隔时间戳:
def generate_minute_samples(group): start = group['StartTime'].iloc[0] end = group['EndTime'].iloc[0] # 生成1分钟间隔的时间序列,确保不超过结束时间 timestamps = pd.date_range(start=start, end=end, freq='1min', inclusive='left') # 如果结束时间不在分钟点,补充最后一个有效分钟戳(可选,按需调整) if (end - timestamps[-1]).total_seconds() > 0: timestamps = timestamps.append(pd.DatetimeIndex([end.floor('min')])) # 构造包含分组信息的结果DataFrame return pd.DataFrame({ 'Group': group['Group'].iloc[0], 'Process': group['Process'].iloc[0], 'Sample Timestamp': timestamps })
3. 分组应用函数并合并结果
通过groupby按分组和进程拆分数据,应用函数后合并所有结果:
final_df = df.groupby(['Group', 'Process']).apply(generate_minute_samples).reset_index(drop=True)
示例输出
Group Process Sample Timestamp 0 A P1 2024-05-20 08:15:00 1 A P1 2024-05-20 08:16:00 2 A P1 2024-05-20 08:17:00 3 A P1 2024-05-20 08:18:00 4 A P2 2024-05-20 09:00:00 5 A P2 2024-05-20 09:01:00 6 A P2 2024-05-20 09:02:00 7 B P1 2024-05-20 10:30:00 8 B P1 2024-05-20 10:31:00
注意事项
inclusive='left'参数确保生成的时间戳不会超过EndTime,如果需要包含EndTime所在的分钟点,可以调整该参数或修改补充逻辑。- 如果同一
(Group, Process)存在多条起止时间记录,需要先合并时间范围再生成序列,当前代码默认每组仅有一条记录。
内容的提问来源于stack exchange,提问作者Debadri Dutta
相关产品推荐
相关产品推荐

