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

如何使用pandas绘制时间间隔直方图?,pandas,Pandas,给定一个间隔数据帧(“开始时间”和“结束时间”),如何有效地生成直方图,显示每个时间点T中有多少间隔是“活动的” 生成示例数据帧的代码(抱歉,我相信有更好的方法): 一个例子: 对于以下数据帧: import pandas as pd pd.DataFrame([{'start':2,'end':5},{'start':3,'end':8},{'start':9,'end':10},{'start':4,'end':5}]) 匹配图类似于: 我的直觉是,需要以某种方式将时间间隔分解为离散值,

给定一个间隔数据帧(“开始时间”和“结束时间”),如何有效地生成直方图,显示每个时间点T中有多少间隔是“活动的”

生成示例数据帧的代码(抱歉,我相信有更好的方法):

一个例子:

对于以下数据帧:

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


我的直觉是,需要以某种方式将时间间隔分解为离散值,以便将它们组合起来,但是如何进行呢?

您可以使用
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()

您可以使用
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()

chrisb的答案很好,但是5和6之间的差距是因为默认的垃圾箱数量是10。这意味着在您的情况下,箱子之间的距离为0.8,因此间距实际上在5.2和6之间

解决此问题的一种方法是手动设置与数据长度相等的存储箱数量:

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

chrisb的答案很好,但5和6之间的差距是因为默认的垃圾箱数量默认为10。这意味着在您的情况下,箱子之间的距离为0.8,因此间距实际上在5.2和6之间

解决此问题的一种方法是手动设置与数据长度相等的存储箱数量:

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

太棒了!非常感谢。试图找出是什么导致5-6之间的差距,因为他们都在名单上…太棒了!非常感谢。试图找出什么可能导致5-6之间的差距,因为他们都在名单上…请使用嵌入图像而不是链接这是我的意图,但似乎我没有足够的声誉这样做,这是我的第一个评论!)我们已经经历了这一过程,您必须等到您获得足够的声誉,会员可能会否决您的投票,这会使您失去分数,因此您必须从一个正确的答案开始,而不是评论请使用嵌入的图像而不是链接这是我的意图,但我似乎没有足够的声誉这样做,这是我的第一个评论!;)我们已经经历了这一切,你必须等到你获得足够的声誉,会员可能会否决你的投票,这会让你失去分数,所以你必须从一个正确的答案开始,而不是评论