2017-01-27 8 views
1

私はゲームの一部である物理的なデバイスを持っています。プレーヤーは、これらのデバイスの1つをアクティブにするためのポイントを取得します。私は「詐欺師」にフラグを立てるロジックを組み込もうとしています。デバイスのすべてのアクティベーションは、2.5秒のスパン内に発生する場合、「イベント」としてカウントされます。私は、「騙されている」プレイヤー(誰かが何度もボタンを何度も妨害している)のスパンを特定しようとしています。データベースでは、これはdeviceAddresseventValuesが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) 

答えて

2

これは、であると比較しようとしているために発生していますを(timePreviousRow - timedelta(seconds=3))に、datetimeを対象とする。 @wpercy、私はそれをやったと思う

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

:私はあなたのコードは次のようになりちょうどtimedelta(seconds=3)deltaを比較しようとするだろう。これで私にこだわってくれてありがとう。 – OnlyDean

+0

しかし私は 'timedelta'の動作に混乱します。どうして私はちょうど「デルタ<= 3」と言うことができないのですか? – OnlyDean

+1

'delta'は' timedelta'オブジェクトで、 '3'は整数です。 Pythonは、 '3'が3秒を意味することを知るのに十分スマートではありません。それは3時間または3日または3年を意味する可能性があるので、それを比較する必要があることを正確に伝える必要があります(この場合、3秒の値を持つ 'timedelta'オブジェクト – wpercy

関連する問題