2015-11-11 3 views
4

У меня есть панд DataFrame с TIMESTAMP колонке (не индекс), и формат метки времени выглядит следующим образом:Панды: бар участок с мультииндексных dataframe

2015-03-31 22:56:45.510 

У меня также есть столбцы, называемые CLASS и AXLES. Я хотел бы вычислить количество записей за каждый месяц отдельно для каждого уникального значения AXLES (AXLES может принимать целочисленное значение между 3-12).

я придумал комбинацию resample и groupby:

resamp = dfWIM.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS 

Это, кажется, дает мне объект dataframe мультииндексного, как показано ниже.

In [72]: resamp 

Out [72]: 

AXLES TIMESTAMP 
3  2014-07-31  5517 
     2014-08-31  31553 
     2014-09-30  42816 
     2014-10-31  49308 
     2014-11-30  44168 
     2014-12-31  45518 
     2015-01-31  54782 
     2015-02-28  52166 
     2015-03-31  47929 
4  2014-07-31  3147 
     2014-08-31  24810 
     2014-09-30  39075 
     2014-10-31  46857 
     2014-11-30  42651 
     2014-12-31  48282 
     2015-01-31  42708 
     2015-02-28  43904 
     2015-03-31  50033 

Как я могу получить доступ к различным компонентам этого объекта multiIndex, чтобы создать график штрихов для следующих условий?

  • данные показывают, когда ОСИ = 3
  • шоу х клещей в месяц - формат года (не дни, часы, минуты и т.д.)

Спасибо!

EDIT: Следующий код дает мне сюжет, но я не мог изменить форматирование xtick на MM-YY.

resamp[3].plot(kind='bar') 

enter image description here

РЕДАКТИРОВАТЬ 2 Ниже приведен фрагмент кода, который генерирует небольшую выборку данных, подобно тому, что у меня есть:

dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]} 
dfTest = pd.DataFrame(dftest) 
dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP)) 
resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS 
resamp[3].plot(kind='bar') 

РЕДАКТИРОВАТЬ 3: Здесь ниже является решением:

A.Plot Вся передискретизируется dataframe (основано на @Ako 'предложение s):

df = resamp.unstack(0) 
df.index = [ts.strftime('%b 20%y') for ts in df.index] 
df.plot(kind='bar', rot=0) 

enter image description here

B.Plot индивидуальный индекс от dataframe повторно создается (на основе @Alexander' предложение s):

df = resamp[3] 
df.index = [ts.strftime('%b 20%y') for ts in df.index] 
df.plot(kind='bar', rot=0) 

enter image description here

+0

Попробуйте 'resamp.unstack (0) .plot (вид = 'бар') '. Это превращает оси в ряд, построенный отдельно. – ako

+0

Спасибо. Это удобно при отображении всех данных в одном сюжете. Есть ли способ изменить формат ярлыков xtick с «2015-03-31 00: 00: 00' до« March 2015 ». Независимо от того, что я пытался, я не мог изменить формат. – marillion

ответ

1

Следующие должны работать, но их трудно протестировать без каких-либо данных.

Начните с сброса индекса, чтобы получить доступ к столбцу TIMESTAMP. Затем используйте strftime, чтобы отформатировать его до желаемого текстового представления (например, мм-yy). Наконец, сбросьте индекс обратно до AXLES и TIMESTAMP.

df = resamp.reset_index() 
df['TIMESTAMP'] = [ts.strftime('%m-%y') for ts in df.TIMESTAMP] 
df.set_index(['AXLES', 'TIMESTAMP'], inplace=True) 
>>> df.xs(3, level=0).plot(kind='bar') 

enter image description here

+0

Я добавил код, чтобы создать небольшой образец данных, аналогичный тому, что у меня есть. Когда я запускаю 'resamp.reset_index (inplace = True)', я получаю следующую ошибку: 'TypeError: не может reset_index inplace в серии для создания DataFrame' – marillion

+0

Я немного изменил ваш код, но я отмечаю это как принятый ответ так как мое решение основано на вашем. Спасибо! – marillion

1

Вы можете создавать и устанавливать метки явно с помощью ax.xaxis.set_major_formatter с ticker.FixedFormatter. Это позволит вам сохранить мультииндексный ваш DataFrame с значениями временных меток, а отображения метки времени в желаемом формате %m-%Y:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
import matplotlib.ticker as ticker 

dftest = {'TIMESTAMP':['2014-08-31','2014-09-30','2014-10-31'], 'AXLES':[3, 3, 3], 'CLASS':[5,6,7]} 
dfTest = pd.DataFrame(dftest) 
dfTest.TIMESTAMP = pd.to_datetime(pd.Series(dfTest.TIMESTAMP)) 
resamp = dfTest.set_index('TIMESTAMP').groupby('AXLES').resample('M', how='count').CLASS 

ax = resamp[3].plot(kind='bar') 
ticklabels = [timestamp.strftime('%m-%Y') for axle, timestamp in resamp.index] 
ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: ticklabels[int(x)])) 
plt.gcf().autofmt_xdate() 

plt.show() 

Урожайность enter image description here

+0

Спасибо за ответ, я нашел решение на основе кода @Alexander и выбрал его как принятый ответ. Я также включил свой код в исходное сообщение как EDIT 3. – marillion

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