Po kilku dniach walki z NumPy i datutilem odkryłem ostatnio niesamowitą bibliotekę Pand. Przeglądałem dokumentację i kod źródłowy, ale nie wiem, jak uzyskać date_range()
, aby wygenerować indeksy w odpowiednich punktach przerwania.Zakresy dat w Pandach
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')
Czego chcę:
2012-01-15
2012-02-15
2012-03-15
...
2012-09-15
Co dostaję:
2012-01-31
2012-02-29
2012-03-31
...
2012-08-31
muszę miesięcznych wielkości kawałki, które konto dla zmiennej liczby dni w miesiącu. Jest to możliwe dzięki dateutil.rrule:
rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)
Brzydki i nieczytelny, ale działa. Jak mogę to zrobić z pandami? Grałem zarówno z date_range()
i period_range()
, jak dotąd bez powodzenia.
Moim rzeczywistym celem jest użycie groupby
, crosstab
i/lub resample
do obliczenia wartości dla każdego okresu w oparciu o sumy/średnie/itp poszczególnych pozycji w okresie. Innymi słowy, chcę, aby przekształcić dane z:
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')
do
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
Zważywszy, że Pandy pochodzi jako narzędzie analizy finansowej, jestem prawie pewien, że jest to prosty i szybki sposób zrobić to. Pomoc doceniona!
Dzięki, to może być podstęp muszę stworzyć rozwiązanie oparte na hack rrule. Jednak nie pomaga to w ponownym próbkowaniu w zakresie, ponieważ resample nadal będzie korzystać z pojemników wyrównanych do początku miesiąca AFAIK. – knite
Jeśli zamierzasz przesunąć o stałą liczbę dni, lepiej będzie użyć miesiąca start 'MS': 'pd.date_range (start, end, freq = 'MS'). Shift (15, freq = pd. datetools.day) ' –