После битвы с NumPy и dateutil в течение нескольких дней, я недавно обнаружил удивительную библиотеку Pandas. Я просматривал документацию и исходный код, но я не могу понять, как получить date_range()
для генерации индексов в правых точках останова.
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')
Что я хочу:
2012-01-15
2012-02-15
2012-03-15
...
2012-09-15
Что я получаю:
2012-01-31
2012-02-29
2012-03-31
...
2012-08-31
Мне нужны месячные куски, которые учитывают переменное число дней в месяце. Это возможно с помощью dateutil.rrule:
rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)
Уродливый и неразборчивый, но он работает. Как это сделать с помощью pandas? Я играл с обоими date_range()
и period_range()
, пока что не повезло.
Моя фактическая цель - использовать groupby
, crosstab
и/или resample
для вычисления значений для каждого периода на основе сумм/средств/etc отдельных записей за период. Другими словами, я хочу преобразовать данные из:
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')
к
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
Учитывая, что Pandas возник как инструмент финансового анализа, я практически уверен, что есть простой и быстрый способ сделать это. Помогите оценить!