熊猫系列获得多个区间的平均值

时间:2019-07-25 17:48:59

标签: python python-3.x pandas

具有间隔均匀的日期时间系列,例如:

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), ...]

组合间隔中获得系列均值的简短方法是什么? (任何插值函数都可以在这里使用)

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

2 个答案:

答案 0 :(得分:3)

让我们将测试源 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 中,不会发生此行为。

答案 1 :(得分:1)

假设您的时间序列按日期编制索引:

No proxy

一些示例数据:

dates = pd.date_range('2019-07-01', '2019-07-25', freq='T')
s = pd.Series(np.random.uniform(1, 100, len(dates)), index=dates)

并且您的间隔在数据框中定义:

2019-07-01 00:00:00    54.851538
2019-07-01 00:01:00    82.493677
2019-07-01 00:02:00    80.589765
2019-07-01 00:03:00    54.973948
2019-07-01 00:04:00    18.216064

只需对intervals = pd.DataFrame([ ['2019-07-01', '2019-07-02'], ['2019-07-02', '2019-07-10'] ], columns=['StartDate', 'EndDate'], dtype='datetime64[ns]') 中的每一行应用一个函数:

intervals

intervals['value'] = intervals.apply(lambda row: s[(row['StartDate'] <= s.index) & (s.index < row['EndDate'])].mean(), axis=1) 在这里均匀隔开,但不会改变结果。日期间隔在右侧(s符号)打开。您可以根据需要进行更改。