繁体   English   中英

Pandas DataFrame,计算满足条件的一行与另一行之间的时间差

[英]Pandas DataFrame, computing the Time Difference between one row and other row which satisfies a condition

根据条件选择基于两行计算时差。 第一行是当前行,第二行是根据条件选择的。 例如,条件可以是Value==1

举例说明

数据帧有时间戳和事件是否发生。

在此处输入图片说明

事件是[大师/B/C]。

输出数据帧应该计算下一个事件的剩余时间 例如:大师

事件发生在12:33。 所以在 12:30,事件的剩余时间=3,即 [12:33 - 12:30] 以分钟为单位。 如果最后一个事件不在数据帧时间窗口内,我们可以填充 NA。

样本输出

加载测试数据帧:

df = pd.DataFrame({'year': [2019] * 5,
                   'month': [8] * 5,
                   'day': [16] * 5,
                   'hour': [12, 12, 12, 12, 13],
                   'minute': [1, 2, 3, 4, 5]})

df = pd.DataFrame(pd.to_datetime(df), columns=['Time_Stamp'])
df['Event_Master'] = [0, 0, 1, 0, 1]

加载的 DataFrame 看起来像:

           Time_Stamp  Event_Master
0 2019-08-16 12:01:00             0
1 2019-08-16 12:02:00             0
2 2019-08-16 12:03:00             1
3 2019-08-16 12:04:00             0
4 2019-08-16 13:05:00             1

为了解决这个问题,我首先添加一个名为“Next_Timestamp”的临时列,当给定事件为 1 时,它首先只获取时间戳。否则它是 pd.NaT。 然后我们可以使用 fillna 方法用每一行的下一个事件的时间回填 pd.NaT 值。 它现在包含每一行的下一个事件的时间。 最后,我们只是从“Next_Timestamp”列中减去“Time_Stamp”列。

df['Next_Timestamp'] = df[df.Event_Master == 1].Time_Stamp
df['Next_Timestamp'].fillna(method='backfill', inplace=True)

df['TimeDiff'] = df.Next_Timestamp - df.Time_Stamp

DataFrame 现在看起来像:

           Time_Stamp  Event_Master      Next_Timestamp TimeDiff
0 2019-08-16 12:01:00             0 2019-08-16 12:03:00 00:02:00
1 2019-08-16 12:02:00             0 2019-08-16 12:03:00 00:01:00
2 2019-08-16 12:03:00             1 2019-08-16 12:03:00 00:00:00
3 2019-08-16 12:04:00             0 2019-08-16 13:05:00 01:01:00
4 2019-08-16 13:05:00             1 2019-08-16 13:05:00 00:00:00

最后,删除临时的“Next_Timestamp”列:

df.drop(['Next_Timestamp'], axis=1, inplace=True)

最终的 DataFrame 看起来像:

           Time_Stamp  Event_Master TimeDiff
0 2019-08-16 12:01:00             0 00:02:00
1 2019-08-16 12:02:00             0 00:01:00
2 2019-08-16 12:03:00             1 00:00:00
3 2019-08-16 12:04:00             0 01:01:00
4 2019-08-16 13:05:00             1 00:00:00

根据需要对其他列重复。 希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM