【问题标题】:Pandas subtracting rows gives wrong result熊猫减去行给出错误的结果
【发布时间】:2026-01-28 23:50:01
【问题描述】:

我的 pandas 数据框由一个列“timeStamp”组成,其元素的类型为 datetime.datetime。我正在尝试获取此列的两个连续行之间的差异,以获得以秒为单位的时间。我使用以下代码。

df["Time"] = df["timeStamp"].diff(0).dt.total_seconds()

通常它工作正常,但是,即使不是这种情况,在很多情况下我都会因为这个操作而得到 0.0。

导致 0.0 的示例值:

import pandas as pd
import datetime
import numpy as np

df = pd.DataFrame({'S.No.': [1, 2, 3, 4], 'ABC': [datetime.datetime(2019,2,25,11,49,50), datetime.datetime(2019,2,25,11,50,0),datetime.datetime(2019,2,25,11,50,7),datetime.datetime(2019,2,25,11,50,12)]})

df["Time"] = df["ABC"].diff(0).dt.seconds

print df

注意:使用python2.7

【问题讨论】:

  • 问题是“diff(0)”,应该是 diff()

标签: python pandas dataframe


【解决方案1】:

试试这个:

print(df["timestamp"].diff().fillna(0).dt.seconds)

0     0
1    10
2     7
3     5

df['difference']=df["timestamp"].diff().fillna(0).dt.seconds
print(df)

            timestamp  difference
0 2019-02-25 11:49:50           0
1 2019-02-25 11:50:00          10
2 2019-02-25 11:50:07           7
3 2019-02-25 11:50:12           5

【讨论】:

  • 现在我得到的是 0 而不是 0.0
  • 如何使用df["timestamp"]=df["timestamp"].apply(np.datetime64),然后检查dtype是否转换为datetime64[ns],那么这段代码应该可以工作。
  • 我现在在我的问题中添加了一些代码,它对你来说运行正确吗?
  • df["ABC"].diff().fillna(0).dt.seconds 对我仍然有效,我无法访问您在 cmets 中添加的链接。
【解决方案2】:

使用

df["Time"] = df["timeStamp"].diff().dt.total_seconds()

改为。

diff 中的参数指定要计算差值的行上方的行数。现在,你用 0 填充它,所以你从自身中减去一个值,这将始终得到 0。将其留空,它使用默认值 1,因此与上面的 1 行不同。

【讨论】:

  • 现在我得到的是 0 而不是 0.0
  • 这很奇怪。您是否使用您在问题中提供的示例数据运行它?因为我得到np.nan, 10.0, 7.0, 5.0,完全符合预期
  • 我现在在我的问题中添加了一些代码,它对你来说运行正确吗?