Подтвердить что ты не робот

Диапазоны дат в Pandas

После битвы с 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 возник как инструмент финансового анализа, я практически уверен, что есть простой и быстрый способ сделать это. Помогите оценить!

4b9b3361

Ответ 1

freq='M' - для месячных частот (см. здесь). Но вы можете использовать .shift для перемещения его на любое количество дней (или любую другую частоту):

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

Ответ 2

На самом деле нет частоты "дня месяца" (например, "DOMXX", например "DOM09" ), но я не вижу причин, чтобы не добавлять ее.

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

У меня нет простого обходного пути для вас в данный момент, потому что resample требует прохождения известного правила частоты. Я думаю, что это должно быть расширено, чтобы иметь возможность использовать любой диапазон дат, который будет использоваться как произвольные края ребер. Просто вопрос времени и взлома...

Ответ 3

попробовать

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