首页 > 解决方案 > 熊猫系列获得多个区间的平均值

问题描述

使用不均匀间隔的日期时间系列,如下所示:

date
2019-02-20 13:00:49.268    41.177929
2019-02-20 13:00:50.275    12.431984
2019-02-20 13:00:51.397    18.042411
2019-02-20 13:00:52.434    13.144179
2019-02-20 13:00:53.542    21.349083
                             ...    
2019-02-20 13:05:55.059    51.763360
2019-02-20 13:05:56.169    58.140644
2019-02-20 13:05:57.279     0.411533
2019-02-20 13:05:58.408    48.404780
2019-02-20 13:05:59.518    14.626680
Name: Values, Length: 285, dtype: float64

并提供格式如下的日期时间间隔(无重叠)列表:[(start1, end1), (start2, end2), ...]

组合间隔中获得系列平均值的捷径是什么?(这里可以使用任何插值函数)

我是熊猫初学者,在这里或熊猫文档中没有找到任何东西,对不起,如果这是一个愚蠢的问题......

标签: pythonpython-3.xpandas

解决方案


让我们将测试源Series定义为:

2019-02-20 13:00:49.268    40
2019-02-20 13:00:50.275    30
2019-02-20 13:02:51.397    18
2019-02-20 13:02:52.434    13
2019-02-20 13:05:53.542    21
2019-02-20 13:05:55.059    51
2019-02-20 13:06:56.169    32
2019-02-20 13:06:57.279    38
2019-02-20 13:08:58.408    48
2019-02-20 13:08:59.518    14
Name: Val, dtype: int64

间隔列表为:

intv = [(pd.to_datetime('2019-02-20 13:00'), pd.to_datetime('2019-02-20 13:01')),
        (pd.to_datetime('2019-02-20 13:06'), pd.to_datetime('2019-02-20 13:07'))]

一个准备步骤是创建一个IntervalIndex

intvInd = pd.IntervalIndex.from_tuples(intv)

然后你想要的平均值可以计算为:

s[[intvInd.contains(v) for v in s.index.values]].mean()

笔记

我使用Pandas版本0.24.2尝试了上述解决方案。正如Inspi注意到的,至少在0.25版本中,最后一条指令必须更改为:

s[[any(intvInd.contains(v)) for v in s.index.values]].mean()

显然,0.24版在“引擎盖下”的某个地方添加了这个any(...) 。0.25版中,不会发生这种行为。


推荐阅读