我有一个类似于:
的数据框 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 :(得分: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