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

SAS技术问题:提取type=1观测值及其前后各一条观测值

提取type=1观测的前后窗口数据(-1,+1)

嘿,我来帮你拆解这个需求和对应的代码逻辑~首先先明确你的核心需求:从时间序列数据里,把所有type=1的行,以及它们的前一行、后一行都捞出来,同时还要避免重复(比如两个相邻的type=1行,它们的重叠行只保留一次)。

先看需求对应的实现方法(以Python pandas为例)

假设你的数据已经整理成DataFrame,这里给你两种常用的实现方式:

方法1:直观索引法(适合理解逻辑)

import pandas as pd

# 模拟你的数据
df = pd.DataFrame({
    'datetime': ['ddmmyy:10:30:00', 'ddmmyy:10:31:00', 'ddmmyy:10:32:00', 
                 'ddmmyy:10:33:00', 'ddmmyy:10:34:00', 'ddmmyy:10:35:00'],
    'type': [0, 0, 1, 0, 1, 0]
})

# 1. 找到所有type=1的行的索引
target_idx = df[df['type'] == 1].index

# 2. 收集需要保留的索引:目标行+前一行+后一行,用集合去重
keep_idx = set()
for idx in target_idx:
    keep_idx.update([idx-1, idx, idx+1])

# 3. 过滤掉超出数据范围的无效索引(比如-1或者超过最后一行的索引)
valid_keep_idx = [i for i in keep_idx if 0 <= i < len(df)]

# 4. 按索引排序后提取数据
result_df = df.loc[sorted(valid_keep_idx)]

方法2:pandas简洁写法(更高效)

import pandas as pd

df = pd.DataFrame({
    'datetime': ['ddmmyy:10:30:00', 'ddmmyy:10:31:00', 'ddmmyy:10:32:00', 
                 'ddmmyy:10:33:00', 'ddmmyy:10:34:00', 'ddmmyy:10:35:00'],
    'type': [0, 0, 1, 0, 1, 0]
})

# 标记需要保留的行:当前行是1,或上一行是1,或下一行是1
df['to_keep'] = (df['type'] == 1) | (df['type'].shift(1) == 1) | (df['type'].shift(-1) == 1)

# 过滤出标记行并删除辅助列
result_df = df[df['to_keep']].drop(columns='to_keep')

代码逻辑拆解

不管哪种方法,核心逻辑都是围绕标记出所有在目标行(type=1)前后1个窗口内的行:

  1. 定位目标行:先找到所有type=1的行的位置,这是窗口的核心。
  2. 扩展窗口:把每个目标行的前一行、自身、后一行都纳入保留范围。用集合或者shift方法的好处是自动处理重复——比如如果两个type=1的行相邻,它们的重叠行(比如前一个的后一行就是后一个的前一行)只会被保留一次。
  3. 清理边界:第一种方法需要手动过滤无效索引(比如第一行的前一行不存在),第二种方法用shift时,边界行的shift(1)或shift(-1)会得到NaN,和1比较时结果为False,自动排除了无效行。
  4. 保持顺序:最后要确保提取的行还是按原来的时间顺序排列,第一种方法通过sorted排序索引,第二种方法因为是按原DataFrame过滤,自然保持顺序。

运行上面的代码后,就能得到你想要的结果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:33:07