如何使用熊猫绘制时间间隔直方图?

时间:2015-09-12 04:28:37

标签: pandas

给定一个间隔的数据帧('开始时间'以及'结束时间'),生成一个显示每个时间点T的直方图的有效方法是多少间隔是活跃的'在它?

生成示例数据帧的代码(道歉,我相信有更好的方法可以做到这一点):

from random import randint

intervals = []

for i in range(50):
    start = randint(0,50)
    intervals.append({'start':start, 'end':start+randint(0,50)})

intervals_df = pd.DataFrame(intervals)

示例:

对于以下数据框:

import pandas as pd
pd.DataFrame([{'start':2,'end':5},{'start':3,'end':8},{'start':9,'end':10},{'start':4,'end':5}])

匹配图表类似于:

enter image description here

我的直觉是,时间间隔需要以某种方式被破坏为离散值,以便它们可以被分箱,但是如何?

2 个答案:

答案 0 :(得分:3)

您可以使用apply为每个范围生成值,然后melt将数据重新整形为长格式。

In [113]: expanded = df.apply(lambda row: pd.Series(np.arange(row['start'], row['end'] + 1)), axis=1)

In [114]: expanded
Out[114]: 
   0   1   2   3   4   5
0  2   3   4   5 NaN NaN
1  3   4   5   6   7   8
2  9  10 NaN NaN NaN NaN
3  4   5 NaN NaN NaN NaN

In [115]: expanded = pd.melt(expanded)['value'].dropna()

In [116]: expanded
Out[116]: 
0      2
1      3
2      9
3      4
4      3
5      4
6     10
7      5
8      4
9      5
12     5
13     6
17     7
21     8
Name: value, dtype: float64

从那里你可以使用内置的直方图或其他类型的分组。

In [117]: expanded.hist()

hist

答案 1 :(得分:1)

chrisb的答案很好,但是你有5到6之间的差距是因为默认的默认箱数是10。这意味着在你的情况下,箱子的距离是0.8,所以差距实际上在5.2到6之间。

一种抵消这种情况的方法是手动设置的数量等于数据的长度:

nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)

结果: enter image description here 1