如何基于时间戳将DataFrame拆分为多个子DataFrame?
按时间戳间隔拆分DataFrame为多个子DataFrame
给定包含content和timestamp字段的DataFrame,当某条记录与前一条的时间间隔超过6小时时,将该记录及后续间隔6小时内的所有行划为一组,最终拆分出多个子DataFrame。以下是具体实现步骤:
步骤说明与代码实现
1. 转换时间戳格式并排序
首先确保timestamp字段为datetime类型,同时按时间升序排列(即使假设数据已排序,这一步也能避免示例数据的混乱问题):
import pandas as pd # 构造示例DataFrame data = { 'content': ['Content_100', 'Content_91', 'Content_49', 'Content_76', 'Content_42', 'Content_39', 'Content_76', 'Content_85'], 'timestamp': ['2023-06-28 21:15:29.605277', '2023-07-10 21:15:29.605277', '2023-07-11 21:15:29.605277', '2023-06-22 21:15:29.605277', '2023-07-04 21:15:29.605277', '2023-07-04 21:15:29.605277', '2023-06-29 21:15:29.605277', '2023-06-27 21:15:29.605277'] } df = pd.DataFrame(data) # 转换为datetime类型并按时间排序 df['timestamp'] = pd.to_datetime(df['timestamp']) df = df.sort_values('timestamp').reset_index(drop=True)
2. 计算时间间隔并生成分组标签
用diff()计算相邻行的时间差,判断是否超过6小时,再通过cumsum()生成连续的分组ID:
# 计算相邻记录的时间差 time_diff = df['timestamp'].diff() # 标记间隔超过6小时的位置(第一行设为True,作为第一个分组的起始) group_split = time_diff > pd.Timedelta(hours=6) group_split.iloc[0] = True # 生成分组标签 df['group_id'] = group_split.cumsum()
3. 拆分为多个子DataFrame
通过groupby遍历分组,提取每个子DataFrame并存储:
# 拆分并存储所有子DataFrame sub_dfs = [] for group_id, group_df in df.groupby('group_id'): # 移除临时的分组ID列 sub_df = group_df.drop('group_id', axis=1) sub_dfs.append(sub_df) # 可选:打印查看每个分组 print(f"分组{group_id}:") print(sub_df) print("---")
结果说明
运行代码后,sub_dfs列表中会存储所有拆分后的子DataFrame:
- 每个子DataFrame内的记录,两两之间时间间隔均不超过6小时
- 不同子DataFrame之间,后一组的第一条记录与前一组的最后一条记录时间间隔超过6小时
示例数据最终会拆分为6个分组,符合时间间隔的拆分规则。
内容的提问来源于stack exchange,提问作者skidjoe
相关产品推荐
相关产品推荐

