如何基于指定列的timedelta阈值将pandas DataFrame拆分为多个子帧
实现代码
直接执行以下代码即可得到目标子帧列表:
import pandas as pd import numpy as np # 原有数据构造与阈值计算代码 rng = pd.date_range('2015-02-24', periods=5, freq='T') df = pd.DataFrame({ 'timestamp': rng, 'Val': np.random.randn(len(rng)) }) df = df.drop(df.index[[2]]) freq = pd.to_timedelta(np.diff(df.timestamp).min()) # 核心拆分逻辑 group_ids = (df['timestamp'].diff() > freq).cumsum() sub_dfs = [group.reset_index(drop=True) for _, group in df.groupby(group_ids)]
逻辑说明
df['timestamp'].diff()计算每行与上一行的时间差,首行结果为NaT- 比较时间差与阈值得到布尔序列,时间差大于阈值的位置标记为
True - 对布尔序列执行累积和
cumsum(),每次遇到True分组ID自动+1,连续时间差不超过阈值的行会被划分到同一分组 - 遍历
groupby结果并重置每个子帧的索引,即可得到符合预期的子帧列表
注意:如果原数据的timestamp列未按时间升序排列,需要先执行df = df.sort_values('timestamp').reset_index(drop=True)再执行拆分逻辑,避免时间差计算错误。
输出验证
打印sub_dfs即可看到预期输出结构:
[ timestamp Val 0 2015-02-24 00:00:00 0.010965 1 2015-02-24 00:01:00 -1.677391, timestamp Val 0 2015-02-24 00:03:00 -1.079073 1 2015-02-24 00:04:00 1.534352]
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

