pandas如何实现相同时间戳下首条记录值减末条记录值
错误原因
你的代码存在两个核心问题:
- 两个
drop_duplicates生成的DataFrame保留的是原始数据的行索引,直接做减法时pandas会按行索引对位计算,不会自动按Time字段匹配,计算逻辑完全不成立。 - 没有指定计算列,
Time列是datetime类型,两个时间值相减会得到0 days格式的时间差,和你要的数值计算结果无关。
修正代码
最简洁高效的写法是直接按Time分组计算,完全不需要绕去重逻辑:
import pandas as pd df = pd.read_csv(DF, usecols=['Time', 'OpenIA']) df['Time'] = pd.to_datetime(df['Time']) # 若不需要对时间做秒级向上取整,可删除下一行 df['Time'] = df['Time'].dt.ceil("S") # 分组后取每组第一个OpenIA减最后一个OpenIA result = df.groupby('Time', as_index=False)['OpenIA'].agg( lambda col: col.iloc[0] - col.iloc[-1] )
运行后result输出完全匹配预期:
| Time | OpenIA |
|---|---|
| 2022-07-15 10:00:23 | 0 |
| 2022-07-15 10:01:11 | 2 |
| 2022-07-15 10:01:33 | -1 |
如果你非要沿用去重的思路,需要先把Time设为索引,保证两个去重结果按时间值对齐,且只计算OpenIA列:
df = df.set_index('Time') first_val = df.drop_duplicates(keep='first')['OpenIA'] last_val = df.drop_duplicates(keep='last')['OpenIA'] result = (first_val - last_val).reset_index()
该写法结果和groupby方案一致,但执行效率和可读性都更差,优先推荐第一种分组写法。
内容的提问来源于stack exchange,提问作者Show_man
相关产品推荐
相关产品推荐

