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个窗口内的行:
- 定位目标行:先找到所有
type=1的行的位置,这是窗口的核心。 - 扩展窗口:把每个目标行的前一行、自身、后一行都纳入保留范围。用集合或者
shift方法的好处是自动处理重复——比如如果两个type=1的行相邻,它们的重叠行(比如前一个的后一行就是后一个的前一行)只会被保留一次。 - 清理边界:第一种方法需要手动过滤无效索引(比如第一行的前一行不存在),第二种方法用
shift时,边界行的shift(1)或shift(-1)会得到NaN,和1比较时结果为False,自动排除了无效行。 - 保持顺序:最后要确保提取的行还是按原来的时间顺序排列,第一种方法通过
sorted排序索引,第二种方法因为是按原DataFrame过滤,自然保持顺序。
运行上面的代码后,就能得到你想要的结果啦~
内容的提问来源于stack exchange,提问作者Tristan Sun
相关产品推荐
相关产品推荐

