2017-01-23 31 views
1

我有一个数据帧,它看起来像: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 

我想要做的就是情节的柱状图,显示的日期分布缩减到一个星期。 例如, 该索引是一个图片ID,我想深入了解2006年10月第一周拍摄的照片数量。换句话说,我需要每周的直方图。

df['week'].iplot(kind='histogram')只给出了周数,但我想将其与年份相关联。

如果有人能够帮助我使用plot.ly来绘制直方图,那将会很棒。 matplotlib图也可以。

感谢您的帮助。

编辑:下面是最终解决我的问题:

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是:

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