Python & MySQL -- 查找彼此相隔 3 秒以内的所有行

Python & MySQL -- find all rows within 3 seconds of one another

我有属于游戏一部分的物理设备。玩家通过激活这些设备之一获得积分。我正在尝试将逻辑合并到标志 'cheaters' 中。如果设备的所有激活都发生在 2.5 秒内,则计为一次 'event'。我正在尝试识别 'cheating' 播放器的跨度(有人只是一遍又一遍地快速干扰按钮)。在数据库中,这看起来像是具有相同 deviceAddresseventValues 为 3 或 4 且 eventTimes 相隔 3 秒的多行。

我很难弄清楚如何在 3 秒内正确地找到彼此相隔 3 秒的事件。这是我当前收到的错误消息:

if delta <= (timePreviousRow - timedelta(seconds=3)) and devPreviousRow == devThisRow:
TypeError: can't compare datetime.timedelta to datetime.datetime

如有任何帮助,我们将不胜感激。

这是我的 MySQL 查询,设置为变量 cheatFinder:

SELECT
eventTime,
deviceAddress,
node_id,
eventType,
eventValue,
sequence
FROM device_data
WHERE eventTime >= DATE_SUB(NOW(), INTERVAL 1 DAY)
AND eventType = 1
AND eventValue BETWEEN 3 AND 4
ORDER BY deviceAddress, eventTime;

这是前 10 个结果:

+---------------------+------------------+------------+-----------+------------+----------+
| eventTime           | deviceAddress | node_id | eventType | eventValue | sequence |
+---------------------+------------------+------------+-----------+------------+----------+
| 2017-01-26 21:19:03 |           776128 |        221 |         1 | 03         |        3 |
| 2017-01-26 21:48:19 |           776128 |        221 |         1 | 03         |        4 |
| 2017-01-27 06:45:50 |           776128 |        221 |         1 | 04         |       18 |
| 2017-01-27 12:41:03 |           776128 |        221 |         1 | 03         |       24 |
| 2017-01-26 23:03:18 |          6096372 |        301 |         1 | 03         |      119 |
| 2017-01-27 00:21:47 |          6096372 |        301 |         1 | 03         |      120 |
| 2017-01-26 23:50:27 |         27038894 |        157 |         1 | 03         |      139 |
| 2017-01-27 01:19:42 |         29641083 |        275 |         1 | 03         |      185 |
| 2017-01-27 00:10:13 |         30371381 |        261 |         1 | 03         |       82 |
| 2017-01-27 00:53:45 |         30371381 |        261 |         1 | 03         |       87 |
+---------------------+------------------+------------+-----------+------------+----------+

这里是有问题的 Python 方法:

import mysql.connector
import pandas
from datetime import datetime,timedelta

. . .     

def findBloodyCheaters(self):
    self.cursor.execute(cheatFinder)
    resultSet = self.cursor.fetchall()
    targetDF = pandas.DataFrame(columns=['eventTime', 'deviceAddress', 'gateway_id', 'eventType', 'eventValue',
                                         'sequence'])
    timePreviousRow = None
    devPreviousRow = None
    for row in resultSetRaw:
        if timePreviousRow is None and devPreviousRow is None:
            timePreviousRow = row[0]
            devPreviousRow = row[1]
        elif timePreviousRow is not None and devPreviousRow is not None:
            timeThisRow = row[0]
            devThisRow = row[1]
            delta = timePreviousRow - timeThisRow
            print(delta)
            if delta <= (timePreviousRow - timedelta(seconds=3)) and devPreviousRow == devThisRow:
                targetDF.append(row)
            timePreviousRow = timeThisRow
            devPreviousRow = devThisRow
            print(targetDF)

发生这种情况是因为您正在尝试比较 delta 这是一个 timedelta 对象与 (timePreviousRow - timedelta(seconds=3)) 这是一个 datetime 对象。我会尝试将 deltatimedelta(seconds=3) 进行比较,因此您的代码将如下所示:

if delta <= timedelta(seconds=3) and devPreviousRow == devThisRow: