2017-01-23 5 views
1

У меня есть dataframe, который выглядит как:Python - черчения недели мудра распределение

 date 
1  2008-10-05 
10  2007-03-30 
100 2008-07-05 
1000 2007-03-30 
1001 2014-08-14 
1002 2007-09-30 
1003 2007-06-14 
1004 2006-01-13 
1005 2006-08-04 
1006 2007-06-14 
1007 2008-11-30 

То, что я хочу сделать, это сюжет гистограмма, которая показывает распределение даты масштабируется до недели. Например, В индексе указывается идентификатор изображения, я хочу рассказать о том, сколько снимков было сделано в первую неделю октября 2006 года. Я хочу еженедельную гистограмму другими словами.

df['week'].iplot(kind='histogram') только возвращает номер недели, но я хочу привязать его к году.

Было бы здорово, если бы кто-то помог мне построить график с использованием plot.ly. Также будет выполнен график matplotlib.

Благодарим за помощь.

Edit: Ниже окончательное решение моей проблемы:

df_new = df.groupby(['year','week']).count()['date'] 
df_dict = df_new.to_dict() 
df_tups = [(' wk#'.join(map(str,key)), df_dict[key]) for key in df_dict.keys()] 
df_tups = sorted(df_tups, key=lambda x : (x[0], x[1])) 
x = ["'"+tup[0][2:] for tup in df_tups] 
y = [tup[1] for tup in df_tups] 
trace1 = go.Bar(
      x = x, 
      y = y 
     ) 

data = [trace1] 
layout = go.Layout(
    xaxis=dict(tickangle=45) 
) 
fig = dict(data=data, layout=layout) 
py.iplot(fig) 
+0

Можете ли вы добавить имена столбцов в свой информационный кадр? –

+0

Конечно, совершенно. @MaximilianPeters –

+0

В ваших данных образца нет столбца «неделя», или я чего-то не хватает? –

ответ

1

пусть ваш ДФ быть:

df = date 
7 2012-06-11 
3 2012-09-28 
19 2012-10-01 
2 2012-10-03 
6 2012-12-22 
1 2013-02-19 
9 2013-02-28 
12 2013-03-12 
4 2013-04-04 
17 2013-04-18 
11 2013-05-17 
5 2013-07-07 
14 2013-10-22 
13 2014-01-16 
15 2014-02-25 
18 2014-03-19 
0 2014-03-31 
16 2014-04-01 
8 2014-04-27 
10 2014-09-20 

То, что вы хотите сделать, это:

df['week'] = df['date'].map(lambda x: x.isocalendar()[1]) 
df['year'] = df['date'].map(lambda x: x.isocalendar()[0]) 
data = df.groupby(['year','week']).count() 

что WLD дают вам:

 date 
year week count  
2012 24  1 
     39  1 
     40  2 
     51  1 
2013 8  1 
     9  1 
     11  1 
     14  1 
     16  1 
     20  1 
     27  1 
     43  1 
2014 3  1 
     9  1 
     12  1 
     14  2 
     17  1 
     38  1 

Теперь, если вы хотите гистограмму, вы можете делать в год, или вы можете делать общий период. но вам нужно будет добавить 52 недели к каждому году за каждый год, когда он будет больше, чем первый год в вашем наборе (годы), в противном случае он будет смешивать номера недель разных лет

0

Когда столбец информационной рамы/a Серия имеет тип datetime, у вас есть специальный аксессуар dt для применения векторизованных функций даты и времени (тот же подход, что и специальный аксессуар для серии строк str). Используйте эту функцию для получения ожидаемой группировки:

df.groupby([df.date.dt.year, df.date.dt.week]).size() 
Out[16]: 
date date 
2006 2  1 
     31  1 
2007 13  2 
     24  2 
     39  1 
2008 27  1 
     40  1 
     48  1 
2014 33  1 
dtype: int64 
Смежные вопросы