2017-03-22 3 views
1

Meine erste Frage zu StackOverflow. Bis jetzt konnte ich mit einer Suche immer Antworten auf meine Fragen finden. Hoffentlich nicht peinlich, indem ich eine doppelte Frage stelle.Pandas Resampler Key Fehler

Ich resample einen Pandas Datenrahmen. Ich möchte dann die Datenframes im Resampler-Objekt durchlaufen, um einige Informationen zu extrahieren.

Wenn ich jedoch die Schlüssel von resampler.groups.keys() zurückgegeben habe, bekomme ich einen Schlüsselfehler, wenn es keine Daten für diese Woche gibt. Dies scheint mir widersprüchlich zu sein. Ich hätte erwartet, einen leeren Datenrahmen oder für die Methode keys() zu bekommen oder überhaupt keinen Schlüssel für die Gruppe dieser Woche zu bekommen.

import pandas as pd 

df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True) 

by_week = df.resample('W-SUN') 
by_week.groups 

Gibt:

{Timestamp('2017-02-26 00:00:00', offset='W-SUN'): 1, 
Timestamp('2017-03-05 00:00:00', offset='W-SUN'): 1, 
Timestamp('2017-03-12 00:00:00', offset='W-SUN'): 1, 
Timestamp('2017-03-19 00:00:00', offset='W-SUN'): 8} 

Dann einfach Summe zu zeigen, dass es keine Daten in der Mitte zwei Wochen:

print by_week.sum() 

        ID DATA 
DATETIME      
2017-02-26 1020754.0 74.0 
2017-03-05  NaN  NaN 
2017-03-12  NaN  NaN 
2017-03-19 7151408.0 2526.0 

anzeigen Schlüssel für Neuabtasters Gruppen:

for key in sorted(by_week.groups.keys(), reverse=True): 
    print key 

2017-03-19 00:00:00 
2017-03-12 00:00:00 
2017-03-05 00:00:00 
2017-02-26 00:00:00 

Versuchen Sie, etwas für EA zu tun ch Gruppen Datenrahmen. Die erste Woche ist in Ordnung, aber die zweite Woche fällt aus. Warum gibt die Methode keys() einen ungültigen Schlüssel zurück?

for key in sorted(by_week.groups.keys(), reverse=True): 
    df = by_week.get_group(key) 
    print df.head() 

           ID DATA 
DATETIME        
2017-03-18 22:41:10.859 1021626 384 
2017-03-18 23:45:18.773 1021627 375 
2017-03-18 23:45:35.309 1021628 359 
2017-03-18 23:46:45.303 1021629 188 
2017-03-19 01:02:23.554 1021633 373 


--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-6-a57723281f49> in <module>() 
     1 for key in sorted(by_week.groups.keys(), reverse=True): 
----> 2  df = by_week.get_group(key) 
     3  print df.head() 

//anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in get_group(self, name, obj) 
    585   inds = self._get_index(name) 
    586   if not len(inds): 
--> 587    raise KeyError(name) 
    588 
    589   return obj.take(inds, axis=self.axis, convert=False) 

KeyError: Timestamp('2017-03-12 00:00:00', offset='W-SUN') 

Mein Workaround unten. Ich freue mich über jede Rückmeldung darüber, ob es einen angemesseneren Weg gibt, damit umzugehen. Dies überspringt die mittleren zwei Wochen ohne Daten. Gibt es einen grundsätzlich besseren Weg, die Daten jeder Woche zu wiederholen?

for key in sorted(by_week.groups.keys(), reverse=True): 
    try: 
     df = by_week.get_group(key) 
    except: 
     continue 
    print df.head() 

           ID DATA 
DATETIME        
2017-03-18 22:41:10.859 1021626 384 
2017-03-18 23:45:18.773 1021627 375 
2017-03-18 23:45:35.309 1021628 359 
2017-03-18 23:46:45.303 1021629 188 
2017-03-19 01:02:23.554 1021633 373 
           ID DATA 
DATETIME        
2017-02-21 13:42:01.133 1020754 74 

Bearbeiten/Update: zu adressieren Antwort unterhalb der in Iterator gebaut zu verwenden. Mein ursprünglicher Code hat den eingebauten Iterator benutzt, aber ich habe das bekommen.

import pandas as pd 
df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True) 
by_week = df.resample('W-SUN') 

for key, df in by_week: 
    print df.head() 

gibt:

Traceback (most recent call last): 
    File "debug_sampler.py", line 10, in <module> 
    for key, df in by_week: 
    File "<redacted path>/pandas/core/groupby.py", line 600, in __iter__ 
    return self.grouper.get_iterator(self.obj, axis=self.axis) 
AttributeError: 'NoneType' object has no attribute 'get_iterator' 

Interessanterweise, wenn ich groupby stattdessen verwenden, es ist in Ordnung. Aber ich hasse es, die Bequemlichkeit der Resample-Methode aufzugeben (z. B. Resampling nach Woche, die an einem Aribatry-Tag endet).

import pandas as pd 
df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True) 

by_week_groupby = df.groupby(lambda x: x.week) 

for key, df in by_week_groupby: 
    print df.head() 

gibt:

       ID DATA 
DATETIME        
2017-02-21 13:42:01.133 1020754 74 
           ID DATA 
DATETIME        
2017-03-19 17:01:01.352 1021625 428 
2017-03-18 22:41:10.859 1021626 384 
2017-03-18 23:45:18.773 1021627 375 
2017-03-18 23:45:35.309 1021628 359 
2017-03-18 23:46:45.303 1021629 188 

die installierte Version von Pandas:

print pd.__version__ 
0.18.1 
+0

Ich bin Sie versuchen, Zeilen in einem Datenrahmen zurückzugeben, der nicht existiert. Resample ('W-SUN') erstellt alle sieben Tage eine Gruppe, unabhängig davon, ob Daten vorhanden sind oder nicht. Wenn Sie die Zeilen abrufen möchten, die dieser leeren Gruppe zugeordnet sind, erhalten Sie den Schlüsselfehler. –

Antwort

0

Sie nicht Ihre eigene Iteration durch das groupby Objekt erzwingen, wenn Pandas hat man schon (wenn auch nicht offensichtlich)

for key, df in byweek: 
    print(df.head()) 
+0

Ich muss meinen jetzt gelöschten Kommentar zurückziehen. Ich habe mich an das Problem nicht erinnert. Dies funktionierte gut, wenn ich lokal in Jupyter iPython Notebook auf meinem Mac verwendete. Aber als ich es in einer Wohnung benutzt habe.PY-Datei von der Befehlszeile auf einer virtuellen Maschine laufen, habe ich das. –

+0

return self.grouper.get_iterator (self.obj, axis = self.axis) AttributError: 'NoneType' -Objekt hat kein Attribut 'get_iterator' \ n Deshalb bin ich zu meiner eigenen Iteration übergegangen. Ich habe nie herausgefunden, warum der integrierte Iterator auf meiner lokalen Maschine, nicht aber auf der virtuellen Maschine funktioniert hat. –

+0

Entschuldigung. Noch ein Kommentar. Auf der virtuellen Maschine funktionierte der integrierte Iterator für ein "reguläres" groupby -Objekt, aber nicht für ein von der ressample-Methode generiertes. Ich fand das auch komisch. –