Python - 绘制按周分布的分布

时间:2017-01-23 20:26:34

标签: python pandas matplotlib plot plotly

我有一个类似于:

的数据框
       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)

2 个答案:

答案 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()

那将给你:

        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周,每年高于你设定的第一年(年),否则会混淆不同年份的一周数

答案 1 :(得分:1)

当数据框/系列的列属于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