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

如何用单行代码基于时长过滤Pandas DataFrame行(忽略日期)

基于时间条件(忽略日期)删除DataFrame行(多采样频率场景)

问题描述

我有一个约1亿行、100列的大型DataFrame,各列采样频率不同。希望**仅基于时间(忽略日期)**删除时长为0.1秒的行,保留时长为0.01秒的行。以下是模拟多采样频率的测试代码:

import pandas as pd
# leave_duration=0.01 seconds
# drop_duration=0.1 seconds
i = pd.date_range('2018-01-01', periods=1000, freq='2ms')
i=i.append(pd.date_range('2018-01-01', periods=1000, freq='3ms'))
i=i.append(pd.date_range('2018-01-01', periods=1000, freq='0.5ms'))
df = pd.DataFrame({'A': range(len(i))}, index=i)
df=df.sort_index()
print(df)
# drop by duration....

示例数据时长约1秒,包含3种采样频率,求单行代码实现目标。


解决方案

嘿,针对你的需求,这里有个单行代码可以直接实现,同时考虑到你数据量巨大,我也加了优化方向:

核心单行代码

df = df[df.index.to_series().diff().dt.total_seconds().fillna(0.01) == 0.01]

代码拆解

  • df.index.to_series():把Datetime索引转成Series,方便计算相邻时间差
  • .diff():计算当前行与上一行的时间间隔(第一行没有上一行,结果是NaN)
  • .dt.total_seconds():把时间差转成秒数,方便和你的目标时长对比
  • .fillna(0.01):给第一行补个默认值——这里直接用要保留的0.01秒,如果你业务里第一行需要特殊处理,改这个值就行
  • == 0.01:筛选出时间间隔恰好是0.01秒的行,也就是留下你要的记录

针对1亿行数据的优化提示

直接用上面的代码可能会有内存压力,给你两个优化方向:

  • 转成numpy数组再筛选,减少内存占用:
    df = df[(df.index.to_series().diff().dt.total_seconds().fillna(0.01).to_numpy() == 0.01)]
    
  • 用drop()结合反向筛选,避免复制整个DataFrame:
    df.drop(df[df.index.to_series().diff().dt.total_seconds().fillna(0.01) != 0.01].index, inplace=True)
    

内容的提问来源于stack exchange,提问作者Tomasz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:04:08