【问题标题】:Matplotlib histogram from x,y values with datetime months as bins来自 x,y 值的 Matplotlib 直方图,日期时间月份为 bin
【发布时间】:2018-02-28 19:03:27
【问题描述】:

我有一个日期时间对象数组 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,2014 年第 3 个月,y 值为 8。

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

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

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

【问题讨论】:

    标签: python pandas numpy datetime matplotlib


    【解决方案1】:

    首先,感谢您提出的带有数据示例的恰当问题。

    这似乎是你想要的:

    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
    

    【讨论】:

    • 感谢您的快速响应,但绘制直方图而不是条形图的工作方式是否相同?
    • 我相信 barplot 是正确的图表类型。如果您在水平轴上有一些数据并且想要为这些点绘制一种密度估计,则使用直方图。如果您有与 x 轴上的某些点相关的数据值,我更喜欢 barplot。
    【解决方案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()
    

    产量

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 2020-01-07
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2018-12-21
      • 2018-11-13
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多