【问题标题】:Plot binned counts of a timeseries with pandas用 pandas 绘制时间序列的分箱计数
【发布时间】:2015-11-15 05:18:50
【问题描述】:

我有一个 pandas 事件数据框,时间戳作为索引,列中有一些标量值(其含义在这里并不那么重要)。我想绘制一个时间序列,在任何一个小时内发生了多少事件。

原始数据(比此处显示的要多得多)如下所示:

    size
timestamp       
2015-08-17 15:07:05.628000  50877
2015-08-17 15:07:05.701000  62989
2015-08-17 15:07:05.752000  33790
2015-08-17 15:07:05.802000  100314
2015-08-17 15:07:05.862000  10372

....

我随后按以下方式按小时对这些事件进行分组:

counts = df.groupby( [df.index.year, df.index.month, df.index.day, df.index.hour] ).count()

即最终得到一个多级索引,有 4 个级别。

但现在我正在努力创建一个漂亮的图表。不可否认,我的 pandas 可视化技能非常狡猾。我没有比:

counts.plot()

但这使得 x 轴完全不可读(元组序列)。我希望 x 轴是一个适当的时间序列,可以很好地与绘图的分辨率等缩放。我在 IPython 中这样做,以防万一。 (我想这个问题可能归结为如何将 4 个索引级别再次折叠为一个时间戳)。

我很乐意阅读某种参考资料,因此请随时向我指出任何有用的链接以供阅读。我环顾四周,但无法立即找到有关特定主题的任何内容。

(另外,请随意提出任何替代方法来实现我想要做的 - 不确定多级索引是否最合适)。

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这种情况下的问题是有多个级别的索引。您可以重新连接不同的级别。所以做一个重新索引。类似的问题可以在here找到。

    关于使用多级索引重新索引的信息,我找到了this。在这种特殊情况下,您必须将级别重新组合为日期时间对象

    import datetime
    df.index = [datetime.datetime(year, month, day, hour) for year, month, day, hour in df.index]
    

    这给出了类似的东西:

    2019-10-14 19:00:00    1
    2020-10-14 19:00:00    2
    2020-10-14 20:00:00    2
    2020-10-15 00:00:00    1
    2020-10-15 05:00:00    1
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的是resample。它旨在按时间范围处理重组。试试:

      df.resample('1H').count().plot()
      

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 2016-11-29
        • 2020-08-03
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-26
        相关资源
        最近更新 更多