python - 分组数据帧中的有效循环以访问当前和先前索引的值(并计算差异)
问题描述
我有一个大数据框,如下所示。数据按 id 后跟 OnTime 排序
id OnTime OffTime
0 1 2017-08-01 09:38:17 2017-08-01 09:49:31
1 1 2017-08-01 09:53:15 2017-08-01 09:54:50
2 1 2017-08-01 09:57:29 2017-08-01 10:10:42
3 2 2017-08-01 09:02:00 2017-08-01 09:27:15
4 2 2017-08-01 09:29:15 2017-08-01 09:43:41
如果 id 相同,我需要计算当前 OnTime 和先前 OffTime 之间的时间差。(这种差异称为timeSince)
寻找一种在 Python 中执行此操作的有效方法。数据框有大约 400k 行。我曾想过按 id 分组,但我不完全确定如何迭代和计算时间差。
输出应如下所示:
timeSince
-1 #since this is the 1st row of ID 1 no previous OffTime exists
3.7333333333333334
2.65
-1 #since this is the 1st row of ID 2 no previous OffTime exists
2.0
解决方案
GroupBy
使用+很诱人lambda
,但不是必需的:
df['timeSince'] = (df['OnTime'] - df.groupby('id')['OffTime'].shift())
df['timeSince'] = (df['timeSince'] / np.timedelta64(1, 'm')).fillna(-1)
print(df)
OffTime OnTime id timeSince
0 2017-08-01 09:49:31 2017-08-01 09:38:17 1 -1.000000
1 2017-08-01 09:54:50 2017-08-01 09:53:15 1 3.733333
2 2017-08-01 10:10:42 2017-08-01 09:57:29 1 2.650000
3 2017-08-01 09:27:15 2017-08-01 09:02:00 2 -1.000000
4 2017-08-01 09:43:41 2017-08-01 09:29:15 2 2.000000
推荐阅读
- javascript - 如何将地图结果传递给 $.ajax jQuery 函数
- postgresql - 如何将我的分钟数据划分为包含 Timescaledb 中每个月的表(PostgreSQL 扩展)
- python - 数数美国拍的电影。IndexError:列表索引超出范围
- c++ - 普通的右值引用和 std::forward 返回的有什么区别?
- jenkins - 在 jenkinsfile 中获取 github 有效负载
- ios - 如何在本机反应中使用 on-press 打开另一个文件
- javascript - 为什么我应该使用 uber 的 fusion.js 而不是 create-react-app?
- git - git filter-branch 错误:在寻找匹配的“”时出现意外的 EOF
- asp.net - CustomValidator 设置为 false,但表单仍在提交
- javascript - 在formdata中添加图像并在webservice javascript中使用