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
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. –