2016-06-16 4 views
5

Ich habe eine DataFrame eine Zeitreihe enthält:GROUPBY mit TimeGrouper 'rückwärts'

rng = pd.date_range('2016-06-01', periods=24*7, freq='H') 
ones = pd.Series([1]*24*7, rng) 
rdf = pd.DataFrame({'a': ones}) 

Letzter Eintrag 2016-06-07 23:00:00. Ich jetzt gruppieren möchten dies durch, sagen wir zwei Tage im Grunde wie so:

rdf.groupby(pd.TimeGrouper('2D')).sum() 

Allerdings möchte ich zu einer Gruppe von meinem letzten Daten beginnend nach hinten zeigen, so anstatt sich dieses Ergebnis:

  a 
2016-06-01 48 
2016-06-03 48 
2016-06-05 48 
2016-06-07 24 

ich würde viel lieber diese erwarten:

  a 
2016-06-01 24 
2016-06-03 48 
2016-06-05 48 
2016-06-07 48 

und wenn sie von '3D' Gruppierung:

  a 
2016-06-01 24 
2016-06-04 72 
2016-06-07 72 

Expected Ergebnis, wenn sie von '4D' Gruppierung ist:

  a 
2016-06-03 72 
2016-06-07 96 

Ich bin diese nicht in der Lage mit jeder Kombination bekommen von closed, label usw. ich denken konnte.

Wie kann ich das erreichen?

Antwort

0

Da ich will in erster Linie zu einer Gruppe von 7 Tagen, auch bekannt als eine Woche ich diese Methode bin jetzt auf die gewünschten Behälter zu kommen:

from pandas.tseries.offsets import Week 

# Let's not make full weeks 
hours = 24*6*4 
rng = pd.date_range('2016-06-01', periods=hours, freq='H') 

# Set week start to whatever the last weekday of the range is 
print("Last day is %s" % rng[-1]) 
freq = Week(weekday=rng[-1].weekday()) 

ones = pd.Series([1]*hours, rng) 
rdf = pd.DataFrame({'a': ones}) 
rdf.groupby(pd.TimeGrouper(freq=freq, closed='right', label='right')).sum() 

Das gibt mir die gewünschte Ausgabe von

2016-06-25 96 
2016-07-02 168 
2016-07-09 168 
+0

Dies kann wahrscheinlich auch mit '' DateOffset''' generischer gemacht werden. – TomTom101

0

Da nun die Frage auf Gruppierung von Woche konzentriert, können Sie einfach:

rdf.resample('W-{}'.format(rdf.index[-1].strftime('%a')), closed='right', label='right').sum() 

Sie loffset verwenden können, um es an die Arbeit - zumindest für die meisten Perioden (mit .resample()):

for i in range(2, 7): 
    print(i) 
    print(rdf.resample('{}D'.format(i), closed='right', loffset='{}D'.format(i)).sum()) 

2 
      a 
2016-06-01 24 
2016-06-03 48 
2016-06-05 48 
2016-06-07 48 
3 
      a 
2016-06-01 24 
2016-06-04 72 
2016-06-07 72 
4 
      a 
2016-06-01 24 
2016-06-05 96 
2016-06-09 48 
5 
       a 
2016-06-01 24 
2016-06-06 120 
2016-06-11 24 
6 
       a 
2016-06-01 24 
2016-06-07 144 
Sie können jedoch auch benutzerdefinierte Gruppierungen erstellen, die die korrekten Werte ohne TimeGrouper wie folgt berechnen:
+0

Vielen Dank! Da der letzte Behälter mein wichtigster ist, müsste ich sehr zuverlässig sein. Seltsam, dass es dafür scheinbar keine einfache Lösung gibt. – TomTom101

+0

Siehe aktualisiert für eine Lösung, um die Gruppenwerte zuverlässig zu berechnen, ohne TimeGroup zu verwenden. – Stefan

+0

Es verdient, angenommen zu werden;) Danke! – TomTom101