私はゲームの一部である物理的なデバイスを持っています。プレーヤーは、これらのデバイスの1つをアクティブにするためのポイントを取得します。私は「詐欺師」にフラグを立てるロジックを組み込もうとしています。デバイスのすべてのアクティベーションは、2.5秒のスパン内に発生する場合、「イベント」としてカウントされます。私は、「騙されている」プレイヤー(誰かが何度もボタンを何度も妨害している)のスパンを特定しようとしています。データベースでは、これはdeviceAddress
、eventValues
が3または4、そしてeventTimes
が3秒以内に同じである複数の行のように見えます。PythonとMySQL - 3秒以内にすべての行を見つける
私は、互いに3秒以内にイベントを適切に見つける方法を理解するのに非常に苦労しています。私が現在受け取っているエラーメッセージは次のとおりです。
if delta <= (timePreviousRow - timedelta(seconds=3)) and devPreviousRow == devThisRow:
TypeError: can't compare datetime.timedelta to datetime.datetime
助けていただければ幸いです。ここで
は変数cheatFinder
に設定私のMySQLのクエリ、次のとおりです。ここで
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)
:私はあなたのコードは次のようになりちょうど
timedelta(seconds=3)
にdelta
を比較しようとするだろう。これで私にこだわってくれてありがとう。 – OnlyDeanしかし私は 'timedelta'の動作に混乱します。どうして私はちょうど「デルタ<= 3」と言うことができないのですか? – OnlyDean
'delta'は' timedelta'オブジェクトで、 '3'は整数です。 Pythonは、 '3'が3秒を意味することを知るのに十分スマートではありません。それは3時間または3日または3年を意味する可能性があるので、それを比較する必要があることを正確に伝える必要があります(この場合、3秒の値を持つ 'timedelta'オブジェクト – wpercy