Matplotlib直方图来自x,y值,日期时间为月份

时间:2017-09-19 21:14:19

标签: python pandas numpy datetime matplotlib

我有一个日期时间对象数组x和一个与这些日期时间对应的y值数组。我正在尝试创建一个直方图,它将所有这些y值按月分组到同一个bin中。基本上添加同月的所有y值并创建一个直方图,显示每个月的总值。

这是我的数据的简化版本:

x = np.array(datetime.datetime(2014, 2, 1, 0, 0), datetime.datetime(2014, 2, 13, 0, 0),\n     
datetime.datetime(2014, 3, 4, 0, 0), datetime.datetime(2014, 3, 6, 0, 0))

y = np.array(4,3,2,6)

最终结果应该是2014年第2个月的直方图,其中y值为7,第3个月为2014年,y值为8。

我尝试的第一件事是从我的两个数组中创建一个pandas数据帧,如下所示:

frame = pd.DataFrame({'x':x,'y':y})

这适用于所有日期时间对象的x映射和所有相应值的y。然而,在创建这个数据帧之后,我有点迷失在如何按月添加所有y值并使用plt.hist()

创建这些月份中的二进制数

2 个答案:

答案 0 :(得分:3)

First of all, thanks for a well-posed question with an example of your data.

This seems to be what you want:

import pandas as pd
import numpy as np
import datetime
%matplotlib inline

x = np.array([datetime.datetime(2014, 2, 1, 0, 0), 
              datetime.datetime(2014, 2, 13, 0, 0),
              datetime.datetime(2014, 3, 4, 0, 0), 
              datetime.datetime(2014, 3, 6, 0, 0)])

y = np.array([4,3,2,6])

frame = pd.DataFrame({'x':x,'y':y})
(frame.set_index('x'). # use date-time as index
 assign(month=lambda x: x.index.month). # add new column with month
 groupby('month'). # group by that column
 sum(). # find a sum of the only column 'y'
 plot.bar()) # make a barplot

The result

的情况下将图片设为链接

答案 1 :(得分:2)

先做这个

df = pd.DataFrame(dict(y=y), pd.DatetimeIndex(x, name='x'))

df

            y
x            
2014-02-01  4
2014-02-13  3
2014-03-04  2
2014-03-06  6

选项1

df.resample('M').sum().hist()

选项2

df.groupby(pd.TimeGrouper('M')).sum().hist()

或先行

df = pd.DataFrame(dict(x=pd.to_datetime(x), y=y))

df

           x  y
0 2014-02-01  4
1 2014-02-13  3
2 2014-03-04  2
3 2014-03-06  6

选项3

df.resample('M', on='x').sum().hist()

收益

enter image description here