python - Pandas - 如何删除时间戳在 6 小时内且匹配 id 的行
问题描述
我有以下示例代码/数据框:
import pandas as pd
import datetime
df_to_db = pd.DataFrame({
'or_enter_dt_tm': ['2021-06-06 23:24:00', '2021-06-07 00:52:00', '2021-06-06 23:18:00',
'2021-06-01 07:59:00', '2021-07-20 19:24:00', '2021-07-24 15:00:00', '2021-07-20 14:24:00'],
'or_exit_dt_tm': ['2021-06-06 23:54:00', '2021-06-07 01:58:00', '2021-06-06 23:58:00',
'2021-06-01 23:12:00', '2021-07-20 19:25:00', '2021-07-24 19:00:00', '2021-07-20 16:27:00'],
'id': ['14', '14', '20', '20', '20', '35', '20']
})
# convert to type datetime
df_to_db['or_enter_dt_tm'] = pd.to_datetime(df_to_db['or_enter_dt_tm'])
df_to_db['or_exit_dt_tm'] = pd.to_datetime(df_to_db['or_exit_dt_tm'])
In[2]: df_to_db
Out[2]:
or_enter_dt_tm or_exit_dt_tm id
0 2021-06-06 23:24:00 2021-06-06 23:54:00 14
1 2021-06-07 00:52:00 2021-06-07 01:58:00 14
2 2021-06-06 23:18:00 2021-06-06 23:58:00 20
3 2021-06-01 07:59:00 2021-06-01 23:12:00 20
4 2021-07-20 19:24:00 2021-07-20 19:25:00 20
5 2021-07-24 15:00:00 2021-07-24 19:00:00 35
6 2021-07-20 14:24:00 2021-07-20 16:27:00 20
我想在以下位置删除行:
- 在 6 小时内已经有另一个 or_enter_dt_tm 标记并且
- 身份证号码匹配
因此,对于这个数据框,我想删除第 1 行和第 6 行,因为它们分别位于第 0 行和第 4 行的 6 小时内,并且 id 匹配(注意:我可以在 6 小时内删除任何一行,但只有一)。
任何帮助将不胜感激!
解决方案
我会在去熊猫之前做这个处理。Pandas 不太擅长逐行比较:
import pandas as pd
import datetime
data = [
['2021-06-06 23:24:00', '2021-06-07 00:52:00', '2021-06-06 23:18:00',
'2021-06-01 07:59:00', '2021-07-20 19:24:00', '2021-07-24 15:00:00', '2021-07-20 14:24:00'],
['2021-06-06 23:54:00', '2021-06-07 01:58:00', '2021-06-06 23:58:00',
'2021-06-01 23:12:00', '2021-07-20 19:25:00', '2021-07-24 19:00:00', '2021-07-20 16:27:00'],
['14', '14', '20', '20', '20', '35', '20']
]
newdata = []
for a,b,c in zip(*data):
d1 = datetime.datetime.fromisoformat(a)
d2 = datetime.datetime.fromisoformat(b)
if not any( c == row[2] and abs((row[0] - d1).total_seconds()) < 6*60*60 for row in newdata):
newdata.append( [d1,d2,c] )
print(newdata)
df_to_db = pd.DataFrame( newdata, columns=['or_enter_dt_tm','or_exit_dt_tm','id'])
print(df_to_db)
输出:
or_enter_dt_tm or_exit_dt_tm id
0 2021-06-06 23:24:00 2021-06-06 23:54:00 14
1 2021-06-06 23:18:00 2021-06-06 23:58:00 20
2 2021-06-01 07:59:00 2021-06-01 23:12:00 20
3 2021-07-20 19:24:00 2021-07-20 19:25:00 20
4 2021-07-24 15:00:00 2021-07-24 19:00:00 35
推荐阅读
- vba - 确定一组文件中的最大值
- google-chrome - Chrome javascript调试器未显示悬停值
- swift - 重新加载collectionview后关闭视图
- r - 将函数应用于向量的索引列表?
- javascript - 如何在 Jest 中模拟 Mongoose 'find()' 函数?
- python-3.x - 为所有行复制excel countifs公式
- internet-explorer - 使用 Internet Explorer 在 login.microsoftonline.com 上的 http 400 错误请求,但刷新页面后登录有效
- php - foreach 循环给出不正确的结果
- .htaccess - 使用 htaccess 的页面重定向 301
- angular - 如何解决 npm 和密码中的“@”的代理问题?