You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas识别时间序列周期?统计周期数及起止时间

嘿,我来帮你搞定这个问题!针对你那900万行的DataFrame,我们可以用Pandas的向量操作高效实现周期统计,既能算出总周期数,又能提取每个周期的起止时间,完全不用担心性能问题。

实现步骤

1. 数据预处理

首先得确保时间列是可操作的datetime类型,要是你需要排除Invalid=True的无效数据,也可以这一步处理:

import pandas as pd

# 把Time列转换成datetime格式(方便后续时间计算)
df['Time'] = pd.to_datetime(df['Time'])

# 可选:过滤掉无效数据(如果不需要保留Invalid=True的行就执行这行)
df = df[~df['Invalid']]

2. 提取所有0值起止点

周期的首尾都是0值,所以先把所有Value=0的行提取出来,这些就是我们的候选起止点:

# 提取所有Value为0的行,保留原DataFrame的索引
zero_rows = df[df['Value'] == 0]

3. 筛选有效周期

不是随便两个0值都能构成周期的——必须两个0之间存在非0数据才算有效周期。我们可以通过计算相邻0值行的索引差来筛选:

# 获取每个0值行的下一个0值行的原索引
zero_rows['next_idx'] = zero_rows.index.shift(-1)

# 计算当前0值行和下一个0值行的索引差
zero_rows['idx_diff'] = zero_rows['next_idx'] - zero_rows.index

# 只保留索引差>1的行(说明中间有非0数据,构成有效周期)
valid_cycles = zero_rows[zero_rows['idx_diff'] > 1].copy()

# 给每个有效周期匹配对应的结束时间(就是下一个0值行的时间)
valid_cycles['end_time'] = zero_rows['Time'].shift(-1)

# 整理结果,只保留起始时间和结束时间两列
valid_cycles = valid_cycles[['Time', 'end_time']].rename(columns={'Time': 'start_time'})

4. 查看结果

现在你就能轻松得到周期数量和每个周期的起止时间了:

# 统计总周期数
total_cycles = len(valid_cycles)
print(f"总共有 {total_cycles} 个有效周期")

# 查看前5个周期的起止时间示例
print("\n前5个周期详情:")
print(valid_cycles.head())
关键说明
  • 用向量操作替代循环,处理900万行数据速度很快,不会出现卡顿。
  • 自动忽略连续的0值行(比如连续几行都是0),这些不会被算作有效周期。
  • 如果最后一个0值行后面没有下一个0值,代码会自动排除这个不完整的“半周期”。

内容的提问来源于stack exchange,提问作者Eekizz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:49:32