在DataFrame中筛选间隔15分钟的连续时间戳
筛选DataFrame中间隔15分钟的连续时间戳记录
嘿,这个需求我之前处理过好几次,用pandas就能轻松搞定,给你一步步拆解解决方案:
步骤说明
首先我们要确保时间列是可计算的datetime类型,然后通过计算相邻时间差来定位符合条件的连续记录,最后把这些记录筛选出来。
完整代码示例
import pandas as pd # 构造你提供的示例数据(补全了缺失的数值) data = { 'timestamp': [ '2017-07-19 17:45:00+02:00', '2017-07-23 02:45:00+02:00', '2017-07-25 14:15:00+02:00', '2017-07-27 07:00:00+02:00', '2017-07-28 09:30:00+02:00', '2017-07-28 18:00:00+02:00', '2017-07-29 04:00:00+02:00', '2017-07-29 04:15:00+02:00', '2017-07-29 11:30:00+02:00', '2017-07-30 09:00:00+02:00', '2017-08-03 02:45:00+02:00' ], 'value': [16, 23, 23, 25, 22, 17, 28, 19, 20, 11, 20] } df = pd.DataFrame(data) # 1. 将时间列转换为datetime类型(必须步骤,否则无法计算时间差) df['timestamp'] = pd.to_datetime(df['timestamp']) # 2. 按时间排序(非常关键!如果数据无序,连续时间点可能不在相邻行) df = df.sort_values('timestamp').reset_index(drop=True) # 3. 计算当前行与前一行的时间差 df['time_diff'] = df['timestamp'].diff() # 4. 标记符合条件的行:要么当前行和前一行差15分钟,要么后一行和当前行差15分钟 # 这样能把连续对的两行都保留下来 mask = (df['time_diff'] == pd.Timedelta(minutes=15)) | (df['time_diff'].shift(-1) == pd.Timedelta(minutes=15)) # 5. 筛选结果并移除临时的时间差列 result_df = df[mask].drop('time_diff', axis=1) # 查看结果 print(result_df)
代码解释
- 转换时间类型:
pd.to_datetime()确保时间列是pandas可识别的datetime格式,这样才能进行时间差计算。 - 排序:如果原始数据不是按时间顺序排列的,连续的时间戳可能分散在不同位置,排序后才能保证相邻行是时间上连续的候选。
- 计算时间差:
diff()方法会计算当前行与前一行的时间间隔,结果是Timedelta类型。 - 标记符合条件的行:用
mask同时标记“当前行与前一行差15分钟”和“当前行与后一行差15分钟”的记录,这样就能把连续的一对(或多对)记录全部保留。比如你示例中的2017-07-29 04:00:00+02:00和2017-07-29 04:15:00+02:00都会被选中。 - 筛选结果:最后移除临时的
time_diff列,得到干净的结果。
扩展说明
如果你的数据中有连续多个15分钟的记录(比如04:00→04:15→04:30),这个方法也能把所有连续的行都保留下来,因为中间的行既满足和前一行的时间差条件,也满足和后一行的条件,会被标记,前后两行也会被正确选中。
内容的提问来源于stack exchange,提问作者may
相关产品推荐
相关产品推荐

