如何将Pandas时间序列按相同时间间隔分组为子序列?
按相同时间间隔拆分Pandas时间序列
要实现将时间序列按连续相同时间间隔拆分为子序列的需求,可以通过计算相邻时间戳的间隔、标记分组ID,再按分组拆分的方式完成,具体步骤如下:
1. 计算相邻时间戳的间隔
首先获取时间序列索引的相邻差值,得到每个位置与前一个位置的时间间隔:
time_diffs = series.index.diff()
2. 生成分组ID
通过比较当前间隔与前一个间隔是否相同,标记出需要拆分的位置,再累加生成连续的分组ID:
# 当当前间隔与前一个不同时,标记为新分组,累加得到分组ID group_ids = (time_diffs != time_diffs.shift(1)).cumsum() - 1
这里time_diffs.shift(1)将间隔序列整体后移一位,与原序列比较后得到布尔值序列(True表示间隔变化),cumsum()将布尔值转为整数累加,最终得到每个元素对应的分组ID。
3. 按分组ID拆分序列
使用groupby按分组ID拆分原序列,转换为列表即可得到目标结果:
grouped_series = [sub_series for _, sub_series in series.groupby(group_ids)]
完整示例代码
import pandas as pd import numpy as np # 构造示例时间序列 min_dates = pd.date_range('2018-06-12 08:01:00', periods=3, freq='T') hour_dates = pd.date_range('2018-09-12 15:00:00', periods=3, freq='H') dates = min_dates.append(hour_dates) series = pd.Series([0.5456, 0.4734, 0.6723, 1.2449, 1.2834, 1.4923], index=dates) # 计算时间间隔 time_diffs = series.index.diff() # 生成分组ID group_ids = (time_diffs != time_diffs.shift(1)).cumsum() - 1 # 拆分得到子序列列表 grouped_series = [sub_series for _, sub_series in series.groupby(group_ids)] # 输出结果 for idx, sub in enumerate(grouped_series): print(f"--- 子序列 {idx+1} ---") print(sub) print(f"时间间隔: {sub.index.diff().unique()[0]}\n")
输出效果
--- 子序列 1 --- 2018-06-12 08:01:00 0.5456 2018-06-12 08:02:00 0.4734 2018-06-12 08:03:00 0.6723 dtype: float64 时间间隔: 0 days 00:01:00 --- 子序列 2 --- 2018-09-12 15:00:00 1.2449 2018-09-12 16:00:00 1.2834 2018-09-12 17:00:00 1.4923 dtype: float64 时间间隔: 0 days 01:00:00
这种方法能准确识别连续的相同间隔块,拆分出无重叠的子序列,完全匹配需求。
内容的提问来源于stack exchange,提问作者PyRsquared
相关产品推荐
相关产品推荐

