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!
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
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) ' –