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

如何按每10分钟时间间隔选取DataFrame中的首行数据?

按固定时间间隔选取Pandas DataFrame行的解决方案

问题描述

给定以下Pandas DataFrame:

import pandas as pd

df = pd.DataFrame({"DateTime":["2020-04-02 06:06:22",
                               "2020-04-02 06:12:22",
                               "2020-04-02 06:14:39",
                               "2020-04-02 06:16:56",
                               "2020-04-02 06:20:34",
                               "2020-04-02 06:35:44"],
                   "Data":[23, 31, 10, 23, 56, 81]})

# 转换DateTime列为datetime类型
df["DateTime"] = df["DateTime"].astype("datetime64[ns]")

输出的DataFrame如下:

DateTime  Data
0 2020-04-02 06:06:22    23
1 2020-04-02 06:12:22    31
2 2020-04-02 06:14:39    10
3 2020-04-02 06:16:56    23
4 2020-04-02 06:20:34    56
5 2020-04-02 06:35:44    81

需要实现按每10分钟的时间间隔选取数据行,最终期望结果为:

DateTime  Data
0 2020-04-02 06:06:22    23
3 2020-04-02 06:16:56    23
5 2020-04-02 06:35:44    81

此前找到的方案仅通过对比相邻行按间隔删除数据,会误删所需行,因此需要更精准的选取逻辑。

解决方案

以下三种方法均可实现需求,可根据数据规模和个人习惯选择:

方法1:遍历筛选(直观易读)

通过遍历每行,记录上一次保留的时间戳,仅保留与上一次保留时间间隔≥10分钟的行:

result = []
last_kept_time = None

for idx, row in df.iterrows():
    if last_kept_time is None or (row["DateTime"] - last_kept_time).total_seconds() >= 10 * 60:
        result.append(row)
        last_kept_time = row["DateTime"]

filtered_df = pd.DataFrame(result).reset_index(drop=True)
print(filtered_df)

方法2:分组筛选(高效简洁)

通过计算每行与首行的时间差,划分10分钟区间,取每个区间的第一行:

# 计算每行与首行的时间差(分钟)
df["time_diff_min"] = (df["DateTime"] - df["DateTime"].iloc[0]).dt.total_seconds() / 60
# 生成10分钟区间标签
df["interval_label"] = (df["time_diff_min"] // 10).astype(int)
# 按区间分组取首行
filtered_df = df.groupby("interval_label").first().reset_index(drop=True)
# 移除辅助列
filtered_df = filtered_df.drop(columns=["time_diff_min", "interval_label"])
print(filtered_df)

方法3:滚动窗口筛选(灵活适配复杂场景)

设置DateTime为索引后,通过滚动检查时间间隔来筛选:

df = df.set_index("DateTime")

# 初始化掩码,默认保留所有行
mask = pd.Series(True, index=df.index)
last_idx = df.index[0]

for idx in df.index[1:]:
    if (idx - last_idx).total_seconds() < 10 * 60:
        mask.loc[idx] = False
    else:
        last_idx = idx

filtered_df = df[mask].reset_index()
print(filtered_df)

三种方法都能得到目标结果,其中方法2利用Pandas原生分组功能,代码更简洁且处理大规模数据时效率更高。

内容的提问来源于Stack Exchange,提问作者user026

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:06:25