如何按每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
相关产品推荐
相关产品推荐

