Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以datetime月为单位的x、y值的Matplotlib直方图_Python_Pandas_Numpy_Datetime_Matplotlib - Fatal编程技术网

Python 以datetime月为单位的x、y值的Matplotlib直方图

Python 以datetime月为单位的x、y值的Matplotlib直方图,python,pandas,numpy,datetime,matplotlib,Python,Pandas,Numpy,Datetime,Matplotlib,我有一个日期时间对象x数组和一个与这些日期时间对应的y值数组。我试图创建一个直方图,将所有y值按月份分组到同一个容器中。基本上,将同一个月的所有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.da

我有一个日期时间对象x数组和一个与这些日期时间对应的y值数组。我试图创建一个直方图,将所有y值按月份分组到同一个容器中。基本上,将同一个月的所有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,2014年第3个月的y值为8

我尝试的第一件事是用我的两个数组创建熊猫数据帧,如下所示:

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

如果x映射到所有datetime对象,y映射到所有相应的值,那么这种方法就可以很好地工作。然而,在创建了这个数据帧之后,我有点不知道如何使用plt.hist()按月份添加所有y值,并在这些月份中创建BIN。首先,感谢您提出了一个带有数据示例的问题

这似乎就是你想要的:

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

首先执行此操作

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
df.resample('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
df.resample('M', on='x').sum().hist()

选项1

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
df.resample('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
df.resample('M', on='x').sum().hist()

选项2

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

或先执行此操作

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
df.resample('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
df.resample('M', on='x').sum().hist()

选项3

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
df.resample('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
df.resample('M', on='x').sum().hist()

收益率

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
df.resample('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
df.resample('M', on='x').sum().hist()

感谢您的快速回复,绘制柱状图而不是条形图是否也能起到同样的作用?我相信条形图是正确的图表类型。如果在水平轴上有一些数据,并且希望为这些点绘制一种密度估计,则使用直方图。如果您有与x轴上的某些点关联的数据值,我更喜欢条形图。