2017-06-07 2 views
2

Ich habe einen Pandas DataFrame mit 5 Spalten.Pandas, sortieren einen Datenrahmen in einer nützlichen Weise, um den Unterschied zwischen Zeiten zu finden. Warum erscheinen Schlüssel- und Wertfehler?

['date', 'sensorId', 'readerId', 'rssi'] 
df_json['time'] = df_json.date.dt.time 

Ich möchte Menschen finden, die einen Laden betreten haben (rssi> 380). Dies wäre jedoch viel genauer, wenn ich auch jeden Datensatz überprüfen könnte, in dem eine Sensor-ID erscheint, und ob die Zeit in diesem Datensatz innerhalb von 5 Sekunden nach dem aktuellen Datensatz liegt.

Daten aus dem Datenrahmen. (Df_json)

     date sensorId readerId rssi 
0 2017-03-17 09:15:59.453 4000068  76 352 
0 2017-03-17 09:20:17.708 4000068  56 374 
1 2017-03-17 09:20:42.561 4000068  60 392 
0 2017-03-17 09:44:21.728 4000514  76 352 
0 2017-03-17 10:32:45.227 4000461  76 332 
0 2017-03-17 12:47:06.639 4000046  43 364 
0 2017-03-17 12:49:34.438 4000046  62 423 
0 2017-03-17 12:52:28.430 4000072  62 430 
1 2017-03-17 12:52:32.593 4000072  62 394 
0 2017-03-17 12:53:17.708 4000917  76 335 
0 2017-03-17 12:54:24.848 4000072  25 402 
1 2017-03-17 12:54:35.738 4000072  20 373 

Ich möchte jezrael Antwort von df [ 'date'] verwenden diff(). Allerdings kann ich dies nicht erfolgreich nutzen, ich erhalte viele verschiedene Fehler. Die Spalte ['Datum'] hat den Typ datetime64 [ns].

Wie die Daten gespeichert sind oben nicht sinnvoll ist, für die .diff() nach einem zu verwenden, die Daten wie unten (dfEntered) gespeichert werden müssen:

Beispieldaten: dfEntered

date  sensorId readerId time   rssi 
    2017-03-17 4000046 43  12:47:06.639000 364 
         62  12:49:34.438000 423 
       4000068 56  09:20:17.708000 374 
         60  09:20:42.561000 392 
         76  09:15:59.453000 352 
       4000072 20  12:54:35.738000 373 
           12:54:42.673000 374 
         25  12:54:24.848000 402 
           12:54:39.723000 406 
         62  12:52:28.430000 430 
           12:52:32.593000 394 
       4000236 18  13:28:14.834000 411 

Ich plane, "Zeit" durch "Datum" zu ersetzen. Zeit ist von dtype Objekt und ich kann nicht scheinen, es zu werfen oder diff() it.'date 'wird genauso nützlich sein.

Der einzige Weg, (ich habe gefunden) von df_json mit erscheinen als dfEntered mit ist: dfEntered = df_json.groupby (von = [df_json.date.dt.time, 'SensorID', 'readerId', 'date' ])

Wenn ich tun:

dfEntered = df_json.groupby(by=[df_json.date.dt.time, 'sensorId', 'readerId'])['date'].diff() 

Ergebnisse in:

File "processData.py", line 61, in <module> 
dfEntered = df_json.groupby(by=[df_json.date.dt.date, 'sensorId', 'readerId', 'rssi'])['date'].diff() 
    File "<string>", line 17, in diff 
    File "C:\Users\danie\Anaconda2\lib\site-packages\pandas\core\groupby.py", line 614, in wrapper 
    raise ValueError 
ValueError 

Wenn ich tun:

dfEntered = df_json.groupby(by=[df_json.date.dt.date, 'sensorId', 'readerId', 'rssi'])['time'].count() 
print(dfEntered['date']) 

Ergebnisse in:

File "processData.py", line 65, in <module> 
    print(dfEntered['date']) 
    File "C:\Users\danie\Anaconda2\lib\site-packages\pandas\core\series.py", line 601, in __getitem__ 
    result = self.index.get_value(self, key) 
    File "C:\Users\danie\Anaconda2\lib\site-packages\pandas\core\indexes\multi.py", line 821, in get_value 
    raise e1 
KeyError: 'date' 

angewendet ich eine .count() an die groupby nur so, dass ich ausgeben kann es. Ich hatte vorher eine .agg ({'date': 'diff'}) versucht, die in den valueError resluts, aber der dtype ist datetime64 [ns] (atleast in der ursprünglichen df_json, kann ich nicht den dtype von dfEntered ['date' ]

wenn die oben funktionieren würde ich eine df haben möchte [df_json.date.dt.date, ‚SensorID‘, ‚readerId‘, ‚Maske‘] Maske wahr, wenn sie einen Laden betreten.

ich dann die unten df haben (enthält sensorIds, die einen Text erhalten haben) ich am Tag, SensorID, readerId die beiden zusammen fusionieren dann möchte

sensor_id sms_status    date_report rssi readerId 
0 5990100 SUCCESS 2017-05-03 13:41:28.412800 500 10 
1 5990001 SUCCESS 2017-05-03 13:41:28.412800 500 11 
2 5990100 SUCCESS 2017-05-03 13:41:30.413000 500 12 
3 5990001 SUCCESS 2017-05-03 13:41:31.413100 500 13 
4 5990100 SUCCESS 2017-05-03 13:41:34.413400 500 14 
5 5990001 SUCCESS 2017-05-03 13:41:35.413500 500 52 
6 5990100 SUCCESS 2017-05-03 13:41:38.413800 500 60 
7 5990001 SUCCESS 2017-05-03 13:41:39.413900 500 61 

. ich hoffe, dass resu würde In einem df, das als [df_json.date.dt.date, 'sensorId', 'readerId', 'mask'] erscheinen könnte, könnte ich sagen, dass eine sensorId mit einer Maske von true eine Konvertierung ist. Eine Umwandlung war, dass sensorId an diesem Tag einen Text erhielt und an diesem Tag auch in den Laden kam.

Ich fange an, vorsichtig zu bekommen, dass mein Ende Ziel nicht einmal erreichbar ist, da ich einfach nicht verstehen, wie Pandas funktioniert noch: D (verdammt Fehler)

UPDATE

dfEntered = dfEntered.reset_index() 

Damit kann ich auf das Datum zugreifen und ein Diff anwenden.

Ich verstehe nicht ganz die Theorie, wie dieses Problem aufgetreten ist, und warum reset_index() dies behoben.

+0

Es ist ein wenig unklar 'everyOtherRecord.contains (specifc ID) [ 'Zeit'] - [ 'Zeit' ]> 00: 00: 05' - Können Sie ein Datenmuster hinzufügen - 5-8 Zeilen? Benutze meine Probe kostenlos aus meiner Antwort. – jezrael

+0

Können Sie Daten zu Frage per Bearbeitungslink hinzufügen, weil schlechte Formatierung von Kommentaren? – jezrael

+0

Haha, ich bin genauso nutzlos mit stackoverflow :) Ich mag deine Antwort sehr, aber ich würde meine Daten auf eine andere Weise bestellen müssen, richtig? –

Antwort

0

Ich glaube, Sie boolean indexing mit Maske müssen mit diff erstellt:

df = pd.DataFrame({'rssi': [500,530,1020,1201,1231,10], 
        'time': pd.to_datetime(['2017-01-01 14:01:08','2017-01-01 14:01:14', 
              '2017-01-01 14:01:17', '2017-01-01 14:01:27', 
              '2017-01-01 14:01:29', '2017-01-01 14:01:30'])}) 
print (df) 
    rssi    time 
0 500 2017-01-01 14:01:08 
1 530 2017-01-01 14:01:14 
2 1020 2017-01-01 14:01:17 
3 1201 2017-01-01 14:01:27 
4 1231 2017-01-01 14:01:29 
5 10 2017-01-01 14:01:30 

print (df['time'].diff()) 
0  NaT 
1 00:00:06 
2 00:00:03 
3 00:00:10 
4 00:00:02 
5 00:00:01 
Name: time, dtype: timedelta64[ns] 

mask = (df['time'].diff() >'00:00:05') & (df['rssi'] > 380) 
print (mask) 
0 False 
1  True 
2 False 
3  True 
4 False 
5 False 
dtype: bool 

df1 = df[mask] 
print (df1) 
    rssi    time 
1 530 2017-01-01 14:01:14 
3 1201 2017-01-01 14:01:27 
+0

Denken Sie, ich bin fast da! Verwenden Sie Ihre Antwort jetzt :) df_entered ['mask'] = (df_entered ['rssi ']> 380) & ((df_entered [' timediff ']> 5.0) | (df_entered [' leserId ']. Diff(). Abs() == 0.0)) Die obige Aussage en ds mit dem Fehler: TypeError: kann ein dtyped [float64] Array nicht mit einem Skalar vom Typ [bool] vergleichen Ich bin nicht genau sicher, warum das passiert –

+0

Es scheint sehr nett, simpl, iest ist nicht Maske zu ne zuweisen Spalte und benutze 'mask = (df_entered ['rssi']> 380) & ((df_entered ['timediff']> 5.0) | (df_entered ['readerId']. diff(). abs() == 0.0)) 'und' df1 = df_entered [Maske] '. – jezrael

+0

Es scheint, dass es einige schlechte Daten gibt - überprüfen Sie ['dtypes'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dtypes.html) durch' print (df.dtypes) ',' Objekt' ist offensichtlich 'string'. – jezrael

Verwandte Themen