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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:25:18