首页 > 解决方案 > 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

我想在以下位置删除行:

  1. 在 6 小时内已经有另一个 or_enter_dt_tm 标记并且
  2. 身份证号码匹配

因此,对于这个数据框,我想删除第 1 行和第 6 行,因为它们分别位于第 0 行和第 4 行的 6 小时内,并且 id 匹配(注意:我可以在 6 小时内删除任何一行,但只有一)。

任何帮助将不胜感激!

标签: pythonpandas

解决方案


我会在去熊猫之前做这个处理。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

推荐阅读