Python & MySQL -- 查找彼此相隔 3 秒以内的所有行
Python & MySQL -- find all rows within 3 seconds of one another
我有属于游戏一部分的物理设备。玩家通过激活这些设备之一获得积分。我正在尝试将逻辑合并到标志 'cheaters' 中。如果设备的所有激活都发生在 2.5 秒内,则计为一次 'event'。我正在尝试识别 'cheating' 播放器的跨度(有人只是一遍又一遍地快速干扰按钮)。在数据库中,这看起来像是具有相同 deviceAddress
、eventValues
为 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
对象。我会尝试将 delta
与 timedelta(seconds=3)
进行比较,因此您的代码将如下所示:
if delta <= timedelta(seconds=3) and devPreviousRow == devThisRow:
我有属于游戏一部分的物理设备。玩家通过激活这些设备之一获得积分。我正在尝试将逻辑合并到标志 'cheaters' 中。如果设备的所有激活都发生在 2.5 秒内,则计为一次 'event'。我正在尝试识别 'cheating' 播放器的跨度(有人只是一遍又一遍地快速干扰按钮)。在数据库中,这看起来像是具有相同 deviceAddress
、eventValues
为 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
对象。我会尝试将 delta
与 timedelta(seconds=3)
进行比较,因此您的代码将如下所示:
if delta <= timedelta(seconds=3) and devPreviousRow == devThisRow: