2015-09-02 2 views
1

Я пытаюсь сделать date_list, который представляет собой диапазон месяцев в прошлом году. Он должен быть отформатирован ['Oct 2014', 'Nov 2014', 'Dec 2014', 'Jan 2015', 'Feb 2015',... 'Sep 2015']Сделайте список месяцев и лет в Pandas

Иногда он работает, а иногда и отключает текущий месяц. И в последний день месяца он не работал, поэтому я сделал это, если заявление.

#If it is the last day of the month, go back a year and add a day to start at beginning of the month 
#Otherwise, go back a year, go to the end of the month, and add a day to start at the beginning of the month 

if datetime.datetime.now().day == calendar.monthrange(date.year, date.month)[1]: 
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.DateOffset(days=1, normalize = True) 
else: 
    range_min = range_max - pd.tseries.offsets.DateOffset(years=1)+ pd.tseries.offsets.MonthEnd(1) + pd.tseries.offsets.DateOffset(days=1, normalize = True) 

Тогда я беру кусочек моих данных, которые прямо сейчас идет от 2014-10-01 до 2015-09-02, как и ожидалось. Затем я делаю список дат! Это критический бит, с которым я борюсь.

# take slice with required of data 
df = df[(df['recvd_dttm'] >= range_min) & 
       (df['recvd_dttm'] <= range_max)] 

#Make a date list in order to get the months to plot later on   
date_list = pd.DataFrame(index=pd.date_range(start = range_min, end = datetime.datetime.now(), freq='M')) 
date_list = date_list.index.to_series().apply(lambda x: datetime.datetime.strftime(x, '%b %Y')).tolist()    

Это может быть проблема с моим диапазоном, что это:

range_min 
Out[5]: Timestamp('2014-10-01 00:00:00') 

range_max 
Out[6]: datetime.datetime(2015, 9, 2, 10, 53, 24, 66000) 

но первые команды date_list выводит следующее:

pd.DataFrame(index=pd.date_range(start = range_min, end = datetime.datetime.now(), freq='M')) 
Out[8]: 
Empty DataFrame 
Columns: [] 
Index: [2014-10-31 00:00:00, 2014-11-30 00:00:00, 2014-12-31 00:00:00, 2015-01-31 00:00:00, 2015-02-28 00:00:00, 2015-03-31 00:00:00, 2015-04-30 00:00:00, 2015-05-31 00:00:00, 2015-06-30 00:00:00, 2015-07-31 00:00:00, 2015-08-31 00:00:00] 

который не включает 2015-09 , поэтому мой date_list отключается в сентябре. Не знаю, почему это происходит. Также, если кто-нибудь знает более простой способ создать этот список, не стесняйтесь его включать!

Спасибо!

+0

Этот список строк, которые вы упоминаете в начале, это все, что вам нужно? Или вы используете панды, потому что хотите работать с этим списком на ваших данных? – swenzel

+0

@swenzel Хороший вопрос. Позднее я назначу date_list столбцу в другом фрейме. Я не совсем уверен, нужны ли панды. – jenryb

ответ

2

Вы можете составить список месяцев в прошлом году без использования панд.

date_list=[datetime.date.today()- dateutil.relativedelta.relativedelta(months = x) for x in range(11,-1,-1)] 
month_list=[datetime.date.strftime(x,'%b %Y') for x in date_list] 

При необходимости вы можете преобразовать вышеуказанный список в датский период панды с индексом как месяцами.

month_list=pd.DataFrame(index=month_list) 
+0

Спасибо! Это сработало. – jenryb

1

Я думаю, что вы проблема в том, что freq = 'M' катится сегодня назад до 08/31. Вы можете посмотреть в pd.tseries.offsets.Month и посмотреть на использование метода rollforward. Я делал это в прошлом.

Другое решение состоит в том, чтобы просто построить полный список дней и заставить его действовать в месячные периоды. Это немного хака, но должно подтолкнуть вас в правильном направлении:

pd.date_range(start = range_min, end = datetime.datetime.now()).to_period('M').unique() 

Тогда просто взять последний 12 из этого списка (потому что она возвращает 13) Я не думаю, что единственное необходимо в конце ,

Смежные вопросы