2012-11-18 12 views
18

Nachdem ich tagelang mit NumPy und dateutil gekämpft habe, habe ich kürzlich die erstaunliche Pandas-Bibliothek entdeckt. Ich habe durch die Dokumentation und den Quellcode geforscht, aber ich kann nicht herausfinden, wie man date_range() erzeugt, um Indizes an den richtigen Haltepunkten zu erzeugen.Datumsbereiche in Pandas

from datetime import date 
import pandas as pd 

start = date('2012-01-15') 
end = date('2012-09-20') 
# 'M' is month-end, instead I need same-day-of-month 
date_range(start, end, freq='M') 

Was ich will:

2012-01-15 
2012-02-15 
2012-03-15 
... 
2012-09-15 

Was erhalte ich:

2012-01-31 
2012-02-29 
2012-03-31 
... 
2012-08-31 

Ich brauche Monat große Stücke, die für die variable Anzahl der Tage in einem Monat ausmachen. Dies ist möglich mit dateutil.rrule:

Hässlich und unleserlich, aber es funktioniert. Wie kann ich das mit Pandas machen? Ich habe mit beiden date_range() und period_range() gespielt, bisher ohne Glück.

Mein eigentliches Ziel ist groupby zu verwenden, crosstab und/oder resample Werte für jede Periode innerhalb der Frist auf Basis von Summen/Mittel/etc einzelner Einträge zu berechnen. Mit anderen Worten, ich Daten zu transformieren will aus:

   total 
2012-01-10 00:01 50 
2012-01-15 01:01 55 
2012-03-11 00:01 60 
2012-04-28 00:01 80 

#Hypothetical usage 
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

zu

   total 
2012-01-09   105 # Values summed 
2012-02-09   0 # Missing from dataframe 
2012-03-09   60 
2012-04-09   0 # Data past end date, not counted 

Da Pandas als Finanzanalysetool entstanden, ich ist so gut wie sicher, dass es eine einfache und schnelle Art und Weise zu tun, Dies. Hilfe geschätzt!

Antwort

20

freq='M' ist für Monatsendfrequenzen (siehe here). Aber Sie können .shift verwenden Sie es von Tagen durch eine beliebige Anzahl zu verschieben (oder einer beliebigen Frequenz für diese Angelegenheit):

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day) 
+0

Dank, kann dies der Trick sein, ich brauche eine Lösung zu erstellen, die auf dem RRULE Hack basiert. Dies hilft jedoch nicht beim Resampling für einen Bereich, da Resample immer noch Bins verwendet, die an den Anfang des Monats AFAIK angepasst sind. – knite

+4

Wenn Sie eine konsistente Anzahl von Tagen verschieben möchten, ist es sinnvoller, den Monatsanfang 'MS' zu verwenden: 'pd.date_range (Start, Ende, Freq = 'MS'). Shift (15, freq = pd. datetools.day) ' –

4

Es ist eigentlich kein „Tag des Monats“ Frequenz (zB „DOMXX“ wie „DOM09“), aber ich sehe keinen Grund, keinen hinzuzufügen.

http://github.com/pydata/pandas/issues/2289

Ich habe keine einfache Abhilfe für Sie im Moment, weil resample erfordert eine bekannte Frequenz Regel vorbei. Ich denke, es sollte erweitert werden, um jeden beliebigen Datumsbereich auch als willkürliche Seitenränder verwenden zu können. Nur eine Frage der Zeit und Hacking ...

+1

Diese Frage traf gerade 10K Ansichten. Vielleicht ist es an der Zeit, diese Funktionalität noch einmal zu überprüfen? – knite

4

versuchen

date_range(start, end, freq=pd.tseries.offsets.DateOffset(months=1)) 
+0

Für 'freq = ...' könnte man auch pd.DateOffset (monates = 1) verwenden – calcium3000

Verwandte Themen