【问题标题】:Calculate time difference between rows in python计算python中行之间的时间差
【发布时间】:2019-11-11 15:36:00
【问题描述】:

如果有几个条件适用,则尝试计算行之间的时间差:

df['open_time'] = pd.to_datetime(df['open_time'], errors='coerce')
df['Time_diff'] = pd.to_datetime(df['Time_diff'], errors='coerce')

for i in range(1, len(df)):
if df.loc[i, 'JOB_ID'] == df.loc[i-1, 'JOB_ID'] and df.loc[i, 'STATION_IDX'] > df.loc[i-1, 'STATION_IDX']:
    df['Time_diff'] = df.loc[i, 'open_time'] - df.loc[i-1, 'open_time']

open_time 是一天中的一个简单时间 HH:mm:ss 执行操作的时间,仅此而已...

原始数据集是:

JOB_ID  DDMMYY  STATION_IDX open_time
121663240   04-02-19    25  5:02:19
121663240   04-02-19    26  5:04:00
121663240   04-02-19    27  5:04:42
121651974   04-02-19    25  6:08:15
121651974   04-02-19    27  6:10:28

我不明白为什么我一直在 Time_diff 的所有行中得到“NaT”

       JOB_ID Time_diff
0   121663240       NaT
1   121663240       NaT
2   121663240       NaT
3   121651974       NaT
4   121651974       NaT
5   121682840       NaT
6   121682840       NaT

我似乎无法在 Google 中找到任何适合我的计算行的答案。

对于上述数据集,我希望得到的预期结果是:

JOB_ID ddmmyy   25 to 26    26 to 27    25 to 27
121663240   04-02-2019  101 42  143
121651974   04-02-2019  NaN NaN 133

【问题讨论】:

  • 您可以显示Time_diffJOB_ID。到那时还好。但是,如果您还显示open_timeSTATION_IDX,您可以获得相关答案...

标签: python dataframe datetime date-arithmetic


【解决方案1】:

因此,如果JOB_ID 对这两行具有相同的值并且 STATION_IDX 增加,那么您只需要一个新列 (Time_diff) 来包含连续行之间列 open_time 的差异。

在 pandas 中,您应该尽量避免显式循环,因为这不是 pandas 优化的方式。这里你想要的可能是:

# first build a mask for rows having same JOB_ID and STATION_IDX as previous one
mask = (df.JOB_ID==df.JOB_ID.shift())&(df.STATION_IDX>df.STATION_IDX.shift())
# then compute the difference
df.loc[mask,'Time_diff'] = df.loc[mask, 'open_time'] - df.shift().loc[mask, 'open_time']

使用您的示例数据,它给出:

      JOB_ID    DDMMYY  STATION_IDX           open_time Time_diff
0  121663240  04-02-19           25 2019-07-01 05:02:19       NaT
1  121663240  04-02-19           26 2019-07-01 05:04:00  00:01:41
2  121663240  04-02-19           27 2019-07-01 05:04:42  00:00:42
3  121651974  04-02-19           25 2019-07-01 06:08:15       NaT
4  121651974  04-02-19           27 2019-07-01 06:10:28  00:02:13

【讨论】:

  • 感谢您的回答。我更新了数据集并尝试了上述建议 - 结果仍然是 NaT...
  • @NirR:您的数据框从未有 2 个连续行共享相同的 JOB_ID 和 STATION_IDX,因此 mask 是一个仅包含 False 值的系列。预期的结果是什么?
  • 我添加了预期的结果。我正在尝试找出车站之间的时间
  • @NirR:我的错。我在连续的STATION_IDX 之间使用==,而它应该是>。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2020-06-30
相关资源
最近更新 更多